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