Source code on Github
{-# OPTIONS --cubical-compatible #-}
module Class.Foldable.Core where

open import Class.Prelude
open import Class.Core
open import Class.Functor
open import Class.Semigroup
open import Class.Monoid

record Foldable (F : Type↑)  _ : Functor F  : Typeω where
  field fold :  _ : Semigroup A    Monoid A   F A  A

  foldMap :  _ : Semigroup B    Monoid B   (A  B)  F A  B
  foldMap f = fold  fmap f

open Foldable ⦃...⦄ public

record Foldable′ (F : Type↑)  _ : Functor F  : Typeω where
  field foldMap′ :  _ : Semigroup B    Monoid B   (A  B)  F A  B

  fold′ :  _ : Semigroup A    Monoid A   F A  A
  fold′ = foldMap′ id

open Foldable′ ⦃...⦄ public

Foldable′⇒Foldable :  _ : Functor F   Foldable′ F  Foldable F
Foldable′⇒Foldable f = let instance _ = f in
  λ where .fold  fold′