module Ordered_collection_common: sig .. end
normalize length_fun thing_with_length i is just i, unless
    i is negative, in which case it's length_fun thing_with_length + i.
    This is used by various python-style slice functions.
val normalize : length_fun:('a -> int) -> 'a -> int -> int
val slice : length_fun:('a -> int) ->
       sub_fun:('a -> pos:int -> len:int -> 'a) -> 'a -> int -> int -> 'a
val get_pos_len_exn : ?pos:int -> ?len:int -> length:int -> int * int
get_pos_len and get_pos_len_exn are intended to be used by functions
 *  that take a sequence (array, string, bigstring, ...) and an optional pos
 *  and len specifying a subrange of the sequence.  Such functions should call
 *  get_pos_len with the length of the sequence and the optional pos and
 *  len, and it will return the pos and len specifying the range, where
 *  the default pos is zero and the default len is to go to the end of the
 *  sequence.
 *
 *  It should be the case that:
 *
 *    0 <= pos <= length
 *    len >= 0
 *    pos + len <= length
 *
 *  Note that this allows pos = length and len = 0, i.e. an empty subrange
 *  at the end of the sequence.
 *
 *  get_pos_len returns (pos', len') specifying a subrange where:
 *
 *    pos' = match pos with None -> 0 | Some i -> i
 *    len' = match len with None -> length - pos | Some i -> i
val get_pos_len : ?pos:int -> ?len:int -> length:int -> (int * int, string) Result.t