\begin{code} module Data.Set.Bind where open import Data.Set.Definition open import Data.Set.Eliminators open import Data.Set.Union open import Prelude open import Path.Reasoning bind : (A → 𝒦 B) → 𝒦 A → 𝒦 B bind k = ⟦ alg k ⟧ where alg : (k : A → 𝒦 B) → ψ A (𝒦 B) alg k .fst ∅ = ∅ alg k .fst (x ∷ xs ⟨ P⟨xs⟩ ⟩) = k x ∪ P⟨xs⟩ alg k .snd .c-trunc _ = trunc alg k .snd .c-com x y _ xs = k x ∪ k y ∪ xs ≡˘⟨ ∪-assoc (k x) (k y) xs ⟩ (k x ∪ k y) ∪ xs ≡⟨ cong (_∪ xs) (∪-com (k x) (k y)) ⟩ (k y ∪ k x) ∪ xs ≡⟨ ∪-assoc (k y) (k x) xs ⟩ k y ∪ k x ∪ xs ∎ alg k .snd .c-dup x _ xs = k x ∪ k x ∪ xs ≡˘⟨ ∪-assoc (k x) (k x) xs ⟩ (k x ∪ k x) ∪ xs ≡⟨ cong (_∪ xs) (∪-idem (k x)) ⟩ k x ∪ xs ∎ \end{code}