Source code on Github{-# OPTIONS --safe #-}
module Prelude.Traversable where
open import Prelude.Init; open SetAsType
open import Prelude.Functor
open import Prelude.Foldable
open import Prelude.Applicative
open import Prelude.Monad
private variable A : Type ℓ; B : Type ℓ′; M : Type↑
record TraversableA (F : Type↑) ⦃ _ : Functor F ⦄ ⦃ _ : Foldable F ⦄ : Typeω where
field
sequenceA : ⦃ Applicative M ⦄ → F (M A) → M (F A)
traverseA : ⦃ Applicative M ⦄ → (A → M B) → F A → M (F B)
traverseA f = sequenceA ∘ fmap f
open TraversableA ⦃...⦄ public
record TraversableM (F : Type↑) ⦃ _ : Functor F ⦄ ⦃ _ : Foldable F ⦄ : Typeω where
field
sequenceM : ⦃ Monad M ⦄ → F (M A) → M (F A)
traverseM : ⦃ Monad M ⦄ → (A → M B) → F A → M (F B)
traverseM f = sequenceM ∘ fmap f
open TraversableM ⦃...⦄ public
instance
TraversableA-Maybe : TraversableA Maybe
TraversableA-Maybe .sequenceA nothing = pure nothing
TraversableA-Maybe .sequenceA (just x) = ⦇ just x ⦈
TraversableM-Maybe : TraversableM Maybe
TraversableM-Maybe .sequenceM = sequenceA
TraversableA-List : TraversableA List
TraversableA-List .sequenceA = go where go = λ where
[] → pure []
(m ∷ ms) → ⦇ m ∷ go ms ⦈
TraversableM-List : TraversableM List
TraversableM-List .sequenceM = sequenceA
TraversableA-List⁺ : TraversableA List⁺
TraversableA-List⁺ .sequenceA (m ∷ ms) = ⦇ m ∷ sequenceA ms ⦈
TraversableM-List⁺ : TraversableM List⁺
TraversableM-List⁺ .sequenceM = sequenceA