API / JavaScript / Belt / HashSet

HashSet

A mutable Hash set which allows customized hash behavior. All data are parameterized by not its only type but also a unique identity in the time of initialization, so that two HashSets of ints initialized with different hash functions will have different type.

RE
type t = int; module I0 = ( val Belt.Id.hashableU( ~hash=(. a: t) => a land 65535, ~eq=(. a, b) => a == b, ) ); let s0 = Belt.HashSet.make(~id=(module I0), ~hintSize=40); module I1 = ( val Belt.Id.hashableU( ~hash=(. a: t) => a land 255, ~eq=(. a, b) => a == b, ) ); let s1 = Belt.HashSet.make(~id=(module I1), ~hintSize=40); Belt.HashSet.add(s1, 0); Belt.HashSet.add(s1, 1);

The invariant must be held: for two elements who are equal, their hashed value should be the same.

Here the compiler would infer s0 and s1 having different type so that it would not mix.

let s0: t(int, I0.identity); let s1: t(int, I1.identity);

We can add elements to the collection (see last two lines in the example above). Since this is an mutable data structure, s1 will contain two pairs.

type t('a, 'id);
type id('a, 'id) = BeltId.hashable('a, 'id);
let make: (~hintSize: int, ~id: id('a, 'id)) => t('a, 'id);
let clear: t('a, 'id) => unit;
let isEmpty: t('a, 'b) => bool;
let add: (t('a, 'id), 'a) => unit;
let copy: t('a, 'id) => t('a, 'id);
let has: (t('a, 'id), 'a) => bool;
let remove: (t('a, 'id), 'a) => unit;
let forEachU: (t('a, 'id), [@bs] ('a => unit)) => unit;
let forEach: (t('a, 'id), 'a => unit) => unit;

Order unspecified.

let reduceU: (t('a, 'id), 'c, [@bs] (('c, 'a) => 'c)) => 'c;
let reduce: (t('a, 'id), 'c, ('c, 'a) => 'c) => 'c;

Order unspecified.

let size: t('a, 'id) => int;
let logStats: t('a, 'b) => unit;
let toArray: t('a, 'id) => array('a);
let fromArray: (array('a), ~id: id('a, 'id)) => t('a, 'id);
let mergeMany: (t('a, 'id), array('a)) => unit;
let getBucketHistogram: t('a, 'b) => array(int);