open import Cat.Prelude
import Cat.Reasoning
open import 1Lab.Classical
open import Data.Dec
open import Data.Sum
module SplitMonoSet where
module Sets = Cat.Reasoning (Sets lzero)
module _ (every-mono-splits : ∀ {A B} (a : ∥ ⌞ A ⌟ ∥) (f : Sets.Hom A B) (f-mono : Sets.is-monic {a = A} {B} f) → Sets.is-split-monic {a = A} {B} f) where
  lem : LEM
  lem P = ∥-∥-out! do
    Sets.make-retract f⁻¹ ret ← f-split
    pure (go (f⁻¹ (inr tt)) λ p → ret $ₚ inr p)
    where
    A : Set lzero
    A = el! (⊤ ⊎ ⌞ P ⌟)
    B : Set lzero
    B = el! (⊤ ⊎ ⊤)
    f : Sets.Hom A B
    f = ⊎-map _ _
    f-mono : Sets.is-monic {a = A} {B} f
    f-mono = embedding→monic {f = f} $ injective→is-embedding! λ where
      {inl _} {inl _} p → refl
      {inl _} {inr _} p → absurd (inl≠inr p)
      {inr _} {inl _} p → absurd (inr≠inl p)
      {inr _} {inr _} p → ap inr prop!
    f-split : Sets.is-split-monic {a = A} {B} f
    f-split = every-mono-splits (inc (inl _)) f λ {c} → f-mono {c}
    go : (f⁻¹r : ∣ A ∣) → (∀ p → f⁻¹r ≡ inr p) → Dec ∣ P ∣
    go (inl _) l = no λ p → inl≠inr (l p)
    go (inr p) l = yes p