module Prelude.Foldable where

open import Prelude.Init
open import Prelude.Monoid

record Foldable (F : Set↑) : Setω where
  field
    foldMap :  {A : Set } {M : Set ℓ′}  _ : 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 [] = ε
  Foldable-List .foldMap f (x  xs) = f x  foldMap f xs

  Foldable-List⁺ : Foldable List⁺
  Foldable-List⁺ .foldMap f (x  xs) = f x  foldMap f xs