sig
  module type Basic =
    sig
      type _ t
      val foldl : ('a -> 'b -> 'a) -> 'a -> 'b Foldable.Basic.t -> 'a
      val foldr :
        ('a -> (unit -> 'b) -> 'b) ->
        (unit -> 'b) -> 'a Foldable.Basic.t -> 'b
    end
  module type S =
    sig
      type _ t
      val foldl : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
      val foldr : ('a -> (unit -> 'b) -> 'b) -> (unit -> 'b) -> 'a t -> 'b
      val foldr' : ('a -> 'b -> 'b) -> 'b -> 'a t -> 'b
      val fold_map :
        (module Monoid.S with type t = 'm) -> ('a -> 'm) -> 'a t -> 'm
      val any : ('a -> bool) -> 'a t -> bool
      val all : ('a -> bool) -> 'a t -> bool
      val find : ('a -> bool) -> 'a t -> 'a option
    end
  module Make :
    functor (F : Basic) ->
      sig
        val foldl : ('a -> 'b -> 'a) -> 'a -> 'b F.t -> 'a
        val foldr :
          ('a -> (unit -> 'b) -> 'b) -> (unit -> 'b) -> 'a F.t -> 'b
        val foldr' : ('a -> 'b -> 'b) -> 'b -> 'a F.t -> 'b
        val fold_map :
          (module Monoid.S with type t = 'm) -> ('a -> 'm) -> 'a F.t -> 'm
        val any : ('a -> bool) -> 'a F.t -> bool
        val all : ('a -> bool) -> 'a F.t -> bool
        val find : ('a -> bool) -> 'a F.t -> 'a option
      end
  module type M =
    sig
      type _ t
      type _ m
      val foldr_m :
        ('a -> 'b -> 'b Foldable.M.m) ->
        'b -> 'a Foldable.M.t -> 'b Foldable.M.m
      val foldl_m :
        ('b -> 'a -> 'b Foldable.M.m) ->
        'b -> 'a Foldable.M.t -> 'b Foldable.M.m
    end
  module type M2 =
    sig
      type _ t
      type (_, _) m
      val foldr_m :
        ('a -> 'b -> ('u, 'b) Foldable.M2.m) ->
        'b -> 'a Foldable.M2.t -> ('u, 'b) Foldable.M2.m
      val foldl_m :
        ('b -> 'a -> ('u, 'b) Foldable.M2.m) ->
        'b -> 'a Foldable.M2.t -> ('u, 'b) Foldable.M2.m
    end
  module type M3 =
    sig
      type _ t
      type (_, _, _) m
      val foldr_m :
        ('a -> 'b -> ('u, 'v, 'b) Foldable.M3.m) ->
        'b -> 'a Foldable.M3.t -> ('u, 'v, 'b) Foldable.M3.m
      val foldl_m :
        ('b -> 'a -> ('u, 'v, 'b) Foldable.M3.m) ->
        'b -> 'a Foldable.M3.t -> ('u, 'v, 'b) Foldable.M3.m
    end
end