sig
  module type COLLECTION =
    sig
      type 'a t
      val empty : 'a CCBatch.COLLECTION.t
      val fold : ('a -> 'b -> 'a) -> 'a -> 'b CCBatch.COLLECTION.t -> 'a
      val map :
        ('a -> 'b) -> 'a CCBatch.COLLECTION.t -> 'b CCBatch.COLLECTION.t
      val filter :
        ('a -> bool) -> 'a CCBatch.COLLECTION.t -> 'a CCBatch.COLLECTION.t
      val filter_map :
        ('a -> 'b option) ->
        'a CCBatch.COLLECTION.t -> 'b CCBatch.COLLECTION.t
      val flat_map :
        ('a -> 'b CCBatch.COLLECTION.t) ->
        'a CCBatch.COLLECTION.t -> 'b CCBatch.COLLECTION.t
    end
  module type S =
    sig
      type 'a t
      type ('a, 'b) op
      val apply : ('a, 'b) CCBatch.S.op -> 'a CCBatch.S.t -> 'b CCBatch.S.t
      val apply_fold :
        ('a, 'b) CCBatch.S.op ->
        ('c -> 'b -> 'c) -> 'c -> 'a CCBatch.S.t -> 'c
      val apply' : 'a CCBatch.S.t -> ('a, 'b) CCBatch.S.op -> 'b CCBatch.S.t
      val id : ('a, 'a) CCBatch.S.op
      val map : ('a -> 'b) -> ('a, 'b) CCBatch.S.op
      val filter : ('a -> bool) -> ('a, 'a) CCBatch.S.op
      val filter_map : ('a -> 'b option) -> ('a, 'b) CCBatch.S.op
      val flat_map : ('a -> 'b CCBatch.S.t) -> ('a, 'b) CCBatch.S.op
      val extern :
        ('a CCBatch.S.t -> 'b 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 = 'a C.t
        type ('a, 'b) op
        val apply : ('a, 'b) op -> 'a t -> 'b t
        val apply_fold : ('a, 'b) op -> ('c -> 'b -> 'c) -> 'c -> 'a t -> 'c
        val apply' : 'a t -> ('a, 'b) op -> 'b t
        val id : ('a, 'a) op
        val map : ('a -> 'b) -> ('a, 'b) op
        val filter : ('a -> bool) -> ('a, 'a) op
        val filter_map : ('a -> 'b option) -> ('a, 'b) op
        val flat_map : ('a -> '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