jon.recoil.org

Parameter Join.Iterator

This module is really an interface for the trie iterators from "Leapfrog Triejoin: A Simple, Worst-Case Optimal Join Algorithm" by Todd L. Veldhuizen (1)), but because we want typed iterators, we cannot implement the open and up methods from the paper directly.

Instead, we build one iterator per level of the trie, and use hidden references (aka type wormholes) to communicate between the different levels of the iterator.

The up function is no longer needed: the iterators at previous depths can directly be reused.

The open function is split into two parts, accept and init, which interact as follows.

There are two special cases:

type 'a t

'a t is the type of iterators with keys of type 'a. The type of values is hidden.

val current : 'a Iterator.t -> 'a option

current it is the key at the current position of the iterator it, or None if the iterator is exhausted.

val advance : 'a Iterator.t -> unit

advance it advances the iterator to the next key.

advance is a no-op on an exhausted iterator.

val seek : 'a Iterator.t -> 'a -> unit

seek it x moves the iterator to the least upper bound for x, i.e. the least key y such that y >= x, exhausting the iterator if no such key exists.

Note: Only keys greater than the current position are considered: seek does nothing if x is smaller than the current key.

val init : 'a Iterator.t -> unit

init it resets it to the first key of a new iteration.

val accept : 'a Iterator.t -> unit

accept it accepts the value associated with the current key, preparing the iterator at the next depth for iteration.

val equal_key : 'a Iterator.t -> 'a -> 'a -> bool

equal_key it is an equality function iterator keys.

val compare_key : 'a Iterator.t -> 'a -> 'a -> int

equal_key it is a comparison function on iterator keys.