-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfanout.ml
38 lines (31 loc) · 943 Bytes
/
fanout.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
module type KEY =
sig
type t
val compare : t -> t -> int
val get : t -> int -> char
end
module Make (Key : KEY) =
struct
type 'a t =
{ fanout : (Key.t * 'a) list array }
let make () =
{ fanout = Array.make 256 [] }
(* XXX(dinosaure): if, one day, we find a bug about the serialization of the IDX file,
may be it's about this function (stable/unstable sort).
*)
let merge lst key value =
List.merge
(fun (k1, _) (k2, _) -> Key.compare k1 k2)
lst [ (key, value) ]
let bind key value { fanout } =
let idx = Char.code (Key.get key 0) in
Array.set fanout idx (merge (Array.get fanout idx) key value)
let length idx { fanout } =
if idx < 256
then List.length (Array.get fanout idx)
else raise (Invalid_argument "Fanout.fanout")
let get idx { fanout } =
if idx < 256
then Array.get fanout idx
else raise (Invalid_argument "Fanout.get")
end