module type S = sig .. end
type key;
type t(+'a);
let empty: t('a);
let is_empty: t('a) => bool;
let mem: (key, t('a)) => bool;
let add: (~key: key, ~data: 'a, t('a)) => t('a);
let singleton: (key, 'a) => t('a);
let remove: (key, t('a)) => t('a);
let merge:
(~f: (key, option('a), option('b)) => option('c), t('a), t('b)) => t('c);
let compare: (~cmp: ('a, 'a) => int, t('a), t('a)) => int;
let equal: (~cmp: ('a, 'a) => bool, t('a), t('a)) => bool;
let iter: (~f: (~key: key, ~data: 'a) => unit, t('a)) => unit;
let fold: (~f: (~key: key, ~data: 'a, 'b) => 'b, t('a), ~init: 'b) => 'b;
let for_all: (~f: (key, 'a) => bool, t('a)) => bool;
let exists: (~f: (key, 'a) => bool, t('a)) => bool;
let filter: (~f: (key, 'a) => bool, t('a)) => t('a);
let partition: (~f: (key, 'a) => bool, t('a)) => (t('a), t('a));
let cardinal: t('a) => int;
let bindings: t('a) => list((key, 'a));
let min_binding: t('a) => (key, 'a);
let max_binding: t('a) => (key, 'a);
let choose: t('a) => (key, 'a);
let split: (key, t('a)) => (t('a), option('a), t('a));
let find: (key, t('a)) => 'a;
let map: (~f: 'a => 'b, t('a)) => t('b);
let mapi: (~f: (key, 'a) => 'b, t('a)) => t('b);