sig
  module type S =
    sig
      type direction_ = Left_Right | Right_Left
      type 'a t
      type 'a elt
      type 'a cursor
      type 'a collection
      type direction = direction_
      type 'a traversal =
          Traverse_All
        | Traverse_If of ('-> bool)
        | Traverse_While of ('-> bool)
      val create : direction -> 'a elt traversal -> 'a collection -> 'a t
      val from_cursor : direction -> 'a elt traversal -> 'a cursor -> 'a t
      val value : 'a t -> 'a elt option
      val get_value : 'a t -> 'a elt
      val at_end : 'a t -> bool
      val at_beg : 'a t -> bool
      val has_next : 'a t -> bool
      val next : 'a t -> 'a t
      val has_prev : 'a t -> bool
      val prev : 'a t -> 'a t
      val goto_beg : 'a t -> 'a t
      val goto_end : 'a t -> 'a t
      val flip : 'a t -> 'a t
      val iter : ('a elt -> unit) -> 'a t -> unit
      val fold : ('-> 'b elt -> 'a) -> '-> 'b t -> 'a
    end
  module Make :
    functor (I : ListCursor.S->
      sig
        type direction_ = Left_Right | Right_Left
        type 'a t
        type 'a elt = 'a
        type 'a cursor = 'I.cursor
        type 'a collection = 'I.list_
        type direction = direction_
        type 'a traversal =
            Traverse_All
          | Traverse_If of ('-> bool)
          | Traverse_While of ('-> bool)
        val create : direction -> 'a elt traversal -> 'a collection -> 'a t
        val from_cursor : direction -> 'a elt traversal -> 'a cursor -> 'a t
        val value : 'a t -> 'a elt option
        val get_value : 'a t -> 'a elt
        val at_end : 'a t -> bool
        val at_beg : 'a t -> bool
        val has_next : 'a t -> bool
        val next : 'a t -> 'a t
        val has_prev : 'a t -> bool
        val prev : 'a t -> 'a t
        val goto_beg : 'a t -> 'a t
        val goto_end : 'a t -> 'a t
        val flip : 'a t -> 'a t
        val iter : ('a elt -> unit) -> 'a t -> unit
        val fold : ('-> 'b elt -> 'a) -> '-> 'b t -> 'a
      end
  module From_List :
    functor (L : Lists.ListSig->
      sig
        type direction_ = Left_Right | Right_Left
        type 'a t
        type 'a elt = 'a
        type 'a cursor = 'ListCursor.Make(L).cursor
        type 'a collection = 'L.t
        type direction = direction_
        type 'a traversal =
            Traverse_All
          | Traverse_If of ('-> bool)
          | Traverse_While of ('-> bool)
        val create : direction -> 'a elt traversal -> 'a collection -> 'a t
        val from_cursor : direction -> 'a elt traversal -> 'a cursor -> 'a t
        val value : 'a t -> 'a elt option
        val get_value : 'a t -> 'a elt
        val at_end : 'a t -> bool
        val at_beg : 'a t -> bool
        val has_next : 'a t -> bool
        val next : 'a t -> 'a t
        val has_prev : 'a t -> bool
        val prev : 'a t -> 'a t
        val goto_beg : 'a t -> 'a t
        val goto_end : 'a t -> 'a t
        val flip : 'a t -> 'a t
        val iter : ('a elt -> unit) -> 'a t -> unit
        val fold : ('-> 'b elt -> 'a) -> '-> 'b t -> 'a
      end
end