sig
  module type COLLECTION =
    sig
      type 'a t
      val empty : 'CCBatch.COLLECTION.t
      val fold : ('-> '-> 'a) -> '-> 'CCBatch.COLLECTION.t -> 'a
      val map :
        ('-> 'b) -> 'CCBatch.COLLECTION.t -> 'CCBatch.COLLECTION.t
      val filter :
        ('-> bool) -> 'CCBatch.COLLECTION.t -> 'CCBatch.COLLECTION.t
      val filter_map :
        ('-> 'b option) ->
        'CCBatch.COLLECTION.t -> 'CCBatch.COLLECTION.t
      val flat_map :
        ('-> 'CCBatch.COLLECTION.t) ->
        'CCBatch.COLLECTION.t -> 'CCBatch.COLLECTION.t
    end
  module type S =
    sig
      type 'a t
      type ('a, 'b) op
      val apply : ('a, 'b) CCBatch.S.op -> 'CCBatch.S.t -> 'CCBatch.S.t
      val apply_fold :
        ('a, 'b) CCBatch.S.op ->
        ('-> '-> 'c) -> '-> 'CCBatch.S.t -> 'c
      val apply' : 'CCBatch.S.t -> ('a, 'b) CCBatch.S.op -> 'CCBatch.S.t
      val id : ('a, 'a) CCBatch.S.op
      val map : ('-> 'b) -> ('a, 'b) CCBatch.S.op
      val filter : ('-> bool) -> ('a, 'a) CCBatch.S.op
      val filter_map : ('-> 'b option) -> ('a, 'b) CCBatch.S.op
      val flat_map : ('-> 'CCBatch.S.t) -> ('a, 'b) CCBatch.S.op
      val extern :
        ('CCBatch.S.t -> 'CCBatch.S.t) -> ('a, 'b) CCBatch.S.op
      val compose :
        ('b, 'c) CCBatch.S.op ->
        ('a, 'b) CCBatch.S.op -> ('a, 'c) CCBatch.S.op
      val ( >>> ) :
        ('a, 'b) CCBatch.S.op ->
        ('b, 'c) CCBatch.S.op -> ('a, 'c) CCBatch.S.op
    end
  module Make :
    functor (C : COLLECTION->
      sig
        type 'a t = 'C.t
        type ('a, 'b) op
        val apply : ('a, 'b) op -> 'a t -> 'b t
        val apply_fold : ('a, 'b) op -> ('-> '-> 'c) -> '-> 'a t -> 'c
        val apply' : 'a t -> ('a, 'b) op -> 'b t
        val id : ('a, 'a) op
        val map : ('-> 'b) -> ('a, 'b) op
        val filter : ('-> bool) -> ('a, 'a) op
        val filter_map : ('-> 'b option) -> ('a, 'b) op
        val flat_map : ('-> 'b t) -> ('a, 'b) op
        val extern : ('a t -> 'b t) -> ('a, 'b) op
        val compose : ('b, 'c) op -> ('a, 'b) op -> ('a, 'c) op
        val ( >>> ) : ('a, 'b) op -> ('b, 'c) op -> ('a, 'c) op
      end
end