Source code on Github{-# OPTIONS --safe #-}
module Prelude.Foldable where
open import Prelude.Init; open SetAsType
open import Prelude.Semigroup
open import Prelude.Monoid
record Foldable (F : Type↑) : Typeω where
  field
    foldMap : ∀ {A : Type ℓ} {M : Type ℓ′}
      → ⦃ _ : Semigroup M ⦄ ⦃ _ : Monoid M ⦄
      → (A → M) → F A → M
open Foldable ⦃...⦄ public
instance
  Foldable-Maybe : Foldable Maybe
  Foldable-Maybe .foldMap f nothing  = ε
  Foldable-Maybe .foldMap f (just x) = f x
  Foldable-List : Foldable List
  Foldable-List .foldMap f = go where go = λ where
    [] → ε
    (x ∷ xs) → f x ◇ go xs
  Foldable-List⁺ : Foldable List⁺
  Foldable-List⁺ .foldMap f (x ∷ xs) = f x ◇ foldMap f xs