Id
Provide utilities to create identified comparators or hashes for data structures used below.
It creates a unique identifier per module of functions so that different data structures with slightly different comparison functions won't mix.
hash
REStype hash<'a, 'id>
Its runtime represenation is a hash function, but signed with a type parameter, so that different hash functions type mismatch.
eq
REStype eq<'a, 'id>
Its runtime represenation is an eq function, but signed with a type parameter, so that different hash functions type mismatch.
cmp
REStype cmp<'a, 'id>
Its runtime representation is a cmp function, but signed with a type parameter, so that different hash functions type mismatch.
Comparable
RESmodule type Comparable = {
type identity
type t
let cmp: Belt.Id.cmp<t, identity>
}
comparable
REStype comparable<'key,'id> =
module(Belt.Id.Comparable with type identity = 'id and type t = 'key)
is a module of functions, here it only includes cmp.
Unlike normal functions, when created, it comes with a unique identity (guaranteed by the type system).
It can be created using function Belt_Id.comparableU
or Belt_Id.comparable
.
The idea of a unique identity when created is that it makes sure two sets would type mismatch if they use different comparison function
MakeComparableU
RESmodule MakeComparableU: (M: {
type t
let cmp: (. t, t) => int
}) => Comparable with type t = M.t
MakeComparable
RESmodule MakeComparable: (M: {
type t
let cmp: (t, t) => int
}) => Comparable with type t = M.t
comparableU
RESlet comparableU: (~cmp: (. 'a, 'a) => int) =>
module(Belt.Id.Comparable with type t = 'a)
comparable
REStype comparable<'key, 'id> =
module(Belt.Id.Comparable with type identity = 'id and type t = 'key)
Hashable
RESmodule type Hashable = {
type identity
type t
let hash: Belt.Id.hash<t, identity>
let eq: Belt.Id.eq<t, identity>
}
hashable
REStype hashable<'key, 'id> =
module(Belt.Id.Hashable with type identity = 'id and type t = 'key)
is a module of functions, here it only includes hash, eq.
Unlike normal functions, when created, it comes with a unique identity (guaranteed by the type system).
It can be created using function Belt_Id.hashableU
or Belt_Id.hashable
.
The idea of a unique identity when created is that it makes sure two hash sets would type mismatch if they use different comparison function.
MakeHashableU
RESmodule MakeHashableU: (M: {
type t
let hash: (. t) => int
let eq: (. t, t) => bool
}) => Hashable with type t = M.t
MakeHashable
RESmodule MakeHashable: (M: {
type t
let hash: t => int
let eq: (t, t) => bool
}) => Hashable with type t = M.t
hashableU
RESlet hashableU: (~hash: (. 'a) => int, ~eq: (. 'a, 'a) => bool) =>
module(Belt.Id.Hashable with type t = 'a)
hashable
RESlet hashable: (~hash: 'a => int, ~eq: ('a, 'a) => bool) =>
module(Belt.Id.Hashable with type t = 'a)