:- module cord.
:- interface.
:- import_module list.
:- type cord(T).
:- func ++(cord.cord(T), cord.cord(T)) = cord.cord(T).
:- func condense(cord.cord(cord.cord(T))) = cord.cord(T).
:- func cons(T, cord.cord(T)) = cord.cord(T).
:- func cord_list_to_cord(list.list(cord.cord(T))) = cord.cord(T).
:- func cord_list_to_list(list.list(cord.cord(T))) = list.list(T).
:- func empty = cord.cord(T).
:- pred equal(cord.cord(T), cord.cord(T)).
:- mode equal((builtin.in), (builtin.in)) is semidet.
:- pred filter((pred T), cord.cord(T), cord.cord(T)).
:- mode filter(builtin.in((pred((builtin.in)) is semidet)), (builtin.in), (builtin.out)) is det.
:- pred filter((pred T), cord.cord(T), cord.cord(T), cord.cord(T)).
:- mode filter(builtin.in((pred((builtin.in)) is semidet)), (builtin.in), (builtin.out), (builtin.out)) is det.
:- func foldl((func(T, U) = U), cord.cord(T), U) = U.
:- pred foldl_pred(pred(T, U, U), cord.cord(T), U, U).
:- mode foldl_pred(builtin.in((pred((builtin.in), (builtin.in), (builtin.out)) is det)), (builtin.in), (builtin.in), (builtin.out)) is det.
:- mode foldl_pred(builtin.in((pred((builtin.in), (builtin.mdi), (builtin.muo)) is det)), (builtin.in), (builtin.mdi), (builtin.muo)) is det.
:- mode foldl_pred(builtin.in((pred((builtin.in), (builtin.di), (builtin.uo)) is det)), (builtin.in), (builtin.di), (builtin.uo)) is det.
:- mode foldl_pred(builtin.in((pred((builtin.in), (builtin.in), (builtin.out)) is semidet)), (builtin.in), (builtin.in), (builtin.out)) is semidet.
:- mode foldl_pred(builtin.in((pred((builtin.in), (builtin.mdi), (builtin.muo)) is semidet)), (builtin.in), (builtin.mdi), (builtin.muo)) is semidet.
:- mode foldl_pred(builtin.in((pred((builtin.in), (builtin.di), (builtin.uo)) is semidet)), (builtin.in), (builtin.di), (builtin.uo)) is semidet.
:- func foldr((func(T, U) = U), cord.cord(T), U) = U.
:- pred foldr_pred(pred(T, U, U), cord.cord(T), U, U).
:- mode foldr_pred(builtin.in((pred((builtin.in), (builtin.in), (builtin.out)) is det)), (builtin.in), (builtin.in), (builtin.out)) is det.
:- mode foldr_pred(builtin.in((pred((builtin.in), (builtin.mdi), (builtin.muo)) is det)), (builtin.in), (builtin.mdi), (builtin.muo)) is det.
:- mode foldr_pred(builtin.in((pred((builtin.in), (builtin.di), (builtin.uo)) is det)), (builtin.in), (builtin.di), (builtin.uo)) is det.
:- mode foldr_pred(builtin.in((pred((builtin.in), (builtin.in), (builtin.out)) is semidet)), (builtin.in), (builtin.in), (builtin.out)) is semidet.
:- mode foldr_pred(builtin.in((pred((builtin.in), (builtin.mdi), (builtin.muo)) is semidet)), (builtin.in), (builtin.mdi), (builtin.muo)) is semidet.
:- mode foldr_pred(builtin.in((pred((builtin.in), (builtin.di), (builtin.uo)) is semidet)), (builtin.in), (builtin.di), (builtin.uo)) is semidet.
:- func from_list(list.list(T)) = cord.cord(T).
:- pred get_first(cord.cord(T), T).
:- mode get_first((builtin.in), (builtin.out)) is semidet.
:- pred get_last(cord.cord(T), T).
:- mode get_last((builtin.in), (builtin.out)) is semidet.
:- pred head_tail(cord.cord(T), T, cord.cord(T)).
:- mode head_tail((builtin.in), (builtin.out), (builtin.out)) is semidet.
:- func init = cord.cord(T).
:- pred is_empty(cord.cord(T)).
:- mode is_empty((builtin.in)) is semidet.
:- func length(cord.cord(T)) = int.
:- func list(cord.cord(T)) = list.list(T).
:- func map(((func T) = U), cord.cord(T)) = cord.cord(U).
:- pred map_foldl(pred(A, B, C, C), cord.cord(A), cord.cord(B), C, C).
:- mode map_foldl(builtin.in((pred((builtin.in), (builtin.out), (builtin.in), (builtin.out)) is det)), (builtin.in), (builtin.out), (builtin.in), (builtin.out)) is det.
:- mode map_foldl(builtin.in((pred((builtin.in), (builtin.out), (builtin.mdi), (builtin.muo)) is det)), (builtin.in), (builtin.out), (builtin.mdi), (builtin.muo)) is det.
:- mode map_foldl(builtin.in((pred((builtin.in), (builtin.out), (builtin.di), (builtin.uo)) is det)), (builtin.in), (builtin.out), (builtin.di), (builtin.uo)) is det.
:- mode map_foldl(builtin.in((pred((builtin.in), (builtin.out), (builtin.in), (builtin.out)) is semidet)), (builtin.in), (builtin.out), (builtin.in), (builtin.out)) is semidet.
:- mode map_foldl(builtin.in((pred((builtin.in), (builtin.out), (builtin.mdi), (builtin.muo)) is semidet)), (builtin.in), (builtin.out), (builtin.mdi), (builtin.muo)) is semidet.
:- mode map_foldl(builtin.in((pred((builtin.in), (builtin.out), (builtin.di), (builtin.uo)) is semidet)), (builtin.in), (builtin.out), (builtin.di), (builtin.uo)) is semidet.
:- pred map_foldl2(pred(A, B, C, C, D, D), cord.cord(A), cord.cord(B), C, C, D, D).
:- mode map_foldl2(builtin.in((pred((builtin.in), (builtin.out), (builtin.in), (builtin.out), (builtin.in), (builtin.out)) is det)), (builtin.in), (builtin.out), (builtin.in), (builtin.out), (builtin.in), (builtin.out)) is det.
:- pred map_foldl3(pred(A, B, C, C, D, D, E, E), cord.cord(A), cord.cord(B), C, C, D, D, E, E).
:- mode map_foldl3(builtin.in((pred((builtin.in), (builtin.out), (builtin.in), (builtin.out), (builtin.in), (builtin.out), (builtin.in), (builtin.out)) is det)), (builtin.in), (builtin.out), (builtin.in), (builtin.out), (builtin.in), (builtin.out), (builtin.in), (builtin.out)) is det.
:- pred map_pred(pred(T, U), cord.cord(T), cord.cord(U)).
:- mode map_pred(builtin.in((pred((builtin.in), (builtin.out)) is det)), (builtin.in), (builtin.out)) is det.
:- pred member(T, cord.cord(T)).
:- mode member((builtin.out), (builtin.in)) is nondet.
:- func rev_list(cord.cord(T)) = list.list(T).
:- func singleton(T) = cord.cord(T).
:- func snoc(cord.cord(T), T) = cord.cord(T).
:- pred split_last(cord.cord(T), cord.cord(T), T).
:- mode split_last((builtin.in), (builtin.out), (builtin.out)) is semidet.
