Data structures and algorithms the MoonBit core library leaves out.
///|
test {
let map : @map.IndexMap[String, Int32] = @map.IndexMap::new()
let _ = map.set("a", 1)
let _ = map.set("b", 2)
@test.assert_eq(map.get_index(1), Some(("b", 2)))
@test.assert_eq(map.get_index_of("a"), Some(0))
}| Package | Carries |
|---|---|
| spec | Refused, the one error type; hash_seed, the per-process seed |
| seq | RingBuffer, Slab, SlotMap, DenseSlotMap, SecondaryMap, GapBuffer, BitVec, BitSet, SparseSet, LinkedList |
| map | IndexMap, IndexSet, MultiMap, SortedMultiMap, BiMap, Counter, DefaultMap, ChainMap, FlatMap, FlatSet, FlatMultiMap, FlatMultiSet, RangeMap, RangeSet, Trie, RadixTree |
| heap | DaryHeap, IndexHeap, PairingHeap, FibonacciHeap, MinMaxHeap, RadixHeap |
| tree | DisjointSet, DisjointSetMap, SegmentTree, LazySegmentTree, Fenwick, IntervalTree, OrderStatisticTree, SkipList, Treap, ArenaTree |
| cache | LruCache, LfuCache, ArcCache, ExpiringCache, memoize, CacheStats |
| sketch | BloomFilter, CuckooFilter, CountMinSketch, HyperLogLog, ThetaSketch, TDigest |
| text | Kmp, BoyerMoore, AhoCorasick, SuffixArray, SuffixAutomaton, SequenceMatcher, the diff formats, Rope |
| phf | PhfMap, PhfSet, PhfOrderedMap, PhfOrderedSet, PhfBuilder |
| cmd/phfgen | the generator behind #phf.map and its three siblings |
| algo | searching, selection, partitioning, merging and lazy adaptors over ArrayView and Iter, plus the combinatoric generators |
///|
test {
let map : @map.IndexMap[Int32, String] = @map.IndexMap::new()
let _ = map.set(3, "three")
let _ = map.set(1, "one")
@test.assert_eq(map.keys().to_array(), [3, 1])
map.sort_keys()
@test.assert_eq(map.keys().to_array(), [1, 3])
let _ = map.swap_remove(1)
@test.assert_eq(map.to_array(), [(3, "three")])
}///|
test {
let cache : @cache.LruCache[String, Int32] = @cache.LruCache::new(capacity=2)
let _ = cache.set("a", 1)
let _ = cache.set("b", 2)
let _ = cache.get("a")
@test.assert_eq(cache.set("c", 3), Some(("b", 2)))
@test.assert_eq(cache.stats().hit_rate(), 1.0)
}///|
test {
let run : Array[Int32] = [5, 1, 4, 2]
@test.assert_eq(@algo.bisect_left(@algo.sorted(run[:]), 4), 2)
@algo.nth_element_in_place(run, 1)
@test.assert_eq(run[1], 2)
@test.assert_eq(@algo.chunks(run.iter(), 2).to_array().length(), 2)
}///|
test {
let pairs : @algo.Permutations[Int32] = @algo.Permutations::new([1, 2, 3], length=2)
@test.assert_eq(pairs.iter().to_array(), [
[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2],
])
}///|
test {
let slots : @seq.SlotMap[String] = @seq.SlotMap::new()
let first = slots.insert("a")
let _ = slots.remove(first)
let _ = slots.insert("b")
@test.assert_eq(slots.get(first), None)
@test.assert_eq(slots.length(), 1)
}///|
test {
let heap : @heap.IndexHeap[Int32] = @heap.IndexHeap::new()
let handle = heap.insert(9)
let _ = heap.insert(4)
let _ = heap.update(handle, 1)
@test.assert_eq(heap.pop(), Some(1))
}///|
test {
let tree : @tree.SegmentTree[Int32] = @tree.SegmentTree::from_array(
[3, 1, 4, 1, 5], op=(a : Int32, b : Int32) => a + b, identity=0,
)
@test.assert_eq(tree.query(1, 4), 6)
}///|
test {
let log : @sketch.HyperLogLog[Int32] = @sketch.HyperLogLog::new(precision=12)
for i in 0..<1000 {
log.add(i)
}
let estimate = log.estimate()
@test.assert_eq(estimate > 900.0 && estimate < 1100.0, true)
}///|
test {
let automaton : @text.SuffixAutomaton = @text.SuffixAutomaton::new("banana")
@test.assert_eq(automaton.count_occurrences("ana"), 2)
}#phf.ordered_map
let keywords : Array[(String, Token)] = [("fn", Fn), ("let", Let), ("match", Match)]
fn token(word : String) -> Token? {
keywords_phf.get(word)
}rule(name: "phf", command: "moonx moonbitstack/moonstl/cmd/phfgen -C \"$mod_dir\" \"$input\" -o \"$output\"")dev_build(rule: "phf", input: "keywords.mbt", output: "keywords.g.mbt")
formatter(ignore: [ "keywords.g.mbt" ])///|
test {
let built : Result[Unit, Int32] = try {
let cache : @cache.LruCache[String, Int32] = @cache.LruCache::new(capacity=0)
let _ = cache
Ok(())
} catch {
@spec.Refused::Capacity(got~) => Err(got)
_ => Err(-1)
}
@test.assert_eq(built, Err(0))
}| Package | What the reference pins |
|---|---|
| seq | ring-buffer overwrite, bit-vector rank and select, gap-buffer edits, list splices |
| map | counter counts and most_common, flat-set order and index, index-map positions, range-set gaps |
| heap | pop order of the d-ary, pairing and fibonacci heaps, min-max alternation, radix pop order |
| tree | fenwick and segment range sums, disjoint-set components, treap in-order |
| cache | lru and lfu eviction, the deadline an entry drops at |
| sketch | count-min within its error, hyperloglog within three standard errors, t-digest near the true quantile, bloom free of false negatives |
| text | kmp and aho-corasick occurrences, the z-function, suffix order, the matcher ratio |
| phf | the map answers its key set, the ordered map gives each key its index |
| algo | bisect on every probe, the generators in enumeration order, selection, merge, prefix and rotate |
moon check --target all --deny-warn
moon build --target all
moon test --target alltest {
let ac = @text.AhoCorasick::new(["he", "she", "his", "hers"])
@test.assert_eq(ac.search_all("ushers").to_array(), [(1, 1), (0, 2), (3, 2)])
assert_true(ac.is_match("ushers"))
assert_false(ac.is_match("us"))
}test {
let cache : @cache.ArcCache[String, Int32] = @cache.ArcCache::new(capacity=2)
let _ = cache.set("a", 1)
let _ = cache.set("b", 2)
let _ = cache.get("a")
let _ = cache.set("c", 3)
let (t1, t2, b1, b2) = cache.lists()
@test.assert_eq(t1 + t2, 2)
@test.assert_eq(b1 + b2 <= 2, true)
}test {
let tree : @tree.ArenaTree[String] = @tree.ArenaTree::new()
let root = tree.add("root")
let a = tree.add_child(root, "a")
let _ = tree.add_child(root, "b")
let _ = tree.add_child(a, "a1")
assert_true(tree.length() == 4)
assert_true(tree.children(root).length() == 2)
assert_true(tree.descendants(root).to_array().length() == 3)
assert_true(tree.remove(a) == Some("a"))
assert_true(tree.length() == 2)
}test {
let bimap : @map.BiMap[Int32, String] = @map.BiMap::new()
let _ = bimap.set(1, "a")
let _ = bimap.set(2, "b")
@test.assert_eq(bimap.get_key("b"), Some(2))
@test.assert_eq(bimap.set(1, "b"), Some((1, "a")))
@test.assert_eq(bimap.get(1), Some("b"))
@test.assert_eq(bimap.get(2), None)
}test {
let set : @seq.BitSet = @seq.BitSet::new()
@test.assert_eq(set.insert(3), true)
@test.assert_eq(set.insert(3), false)
@test.assert_eq(set.contains(3), true)
@test.assert_eq(set.length(), 1)
@test.assert_eq(set.select(0), Some(3))
@test.assert_eq(set.rank(4), 1)
}test {
let bits : @seq.BitVec = @seq.BitVec::new()
bits.push(true)
bits.push(false)
bits.push(true)
@test.assert_eq(bits.length(), 3)
@test.assert_eq(bits.get(2), Some(true))
@test.assert_eq(bits.count_ones(), 2)
}test {
let bm = @text.BoyerMoore::new("needle")
assert_eq(bm.search("a needle in a haystack"), Some(2))
assert_eq(bm.search("haystack"), None)
}test {
let base : Map[String, Int32] = Map([])
base.set("a", 1)
let chain : @map.ChainMap[String, Int32] = @map.ChainMap::new([base])
@test.assert_eq(chain.get("a"), Some(1))
let child = chain.new_child()
child.set("a", 2)
@test.assert_eq(child.get("a"), Some(2))
@test.assert_eq(chain.get("a"), Some(1))
}test {
let combinations : @algo.Combinations[Int32] = @algo.Combinations::new(
[1, 2, 3, 4],
k=2,
)
@test.assert_eq(combinations.iter().to_array(), [
[1, 2],
[1, 3],
[1, 4],
[2, 3],
[2, 4],
[3, 4],
])
}test {
let with_repeats : @algo.CombinationsWithReplacement[Int32] = @algo.CombinationsWithReplacement::new(
[1, 2],
k=2,
)
@test.assert_eq(with_repeats.iter().to_array(), [[1, 1], [1, 2], [2, 2]])
}test {
let sketch : @sketch.CountMinSketch[String] = @sketch.CountMinSketch::new(
epsilon=0.01,
confidence=0.99,
)
for _ in 0..<5 {
sketch.insert("a")
}
assert_true(sketch.estimate("a") >= 5)
assert_true(sketch.estimate("b") == 0)
assert_true(sketch.total() == 5L)
}test {
let counter : @map.Counter[String] = @map.Counter::new()
@test.assert_eq(counter.incr("a"), 1)
@test.assert_eq(counter.incr_by("a", 2), 3)
@test.assert_eq(counter.decr("a"), 2)
@test.assert_eq(counter.total(), 2L)
}test {
let filter : @sketch.CuckooFilter[String] = @sketch.CuckooFilter::new(
expected_items=100,
)
assert_true(filter.insert("a"))
assert_true(filter.may_contain("a"))
assert_true(filter.remove("a"))
assert_true(!filter.may_contain("a"))
}test {
let heap : @heap.DaryHeap[Int32] = try! @heap.DaryHeap::new()
heap.push(3)
heap.push(1)
heap.push(2)
assert_true(heap.peek() == Some(1))
assert_true(heap.pop() == Some(1))
assert_true(heap.length() == 2)
}test {
let map : @map.DefaultMap[String, Int32] = @map.DefaultMap::new(factory=key => {
key.length()
})
@test.assert_eq(map.get_or_init("abc"), 3)
@test.assert_eq(map.length(), 1)
@test.assert_eq(map.get("abc"), Some(3))
}test {
let sets : @tree.DisjointSet = @tree.DisjointSet::new()
let a = sets.add()
let b = sets.add()
let c = sets.add()
assert_true(sets.union(a, b))
assert_true(sets.connected(a, b))
assert_true(!sets.connected(a, c))
assert_true(sets.set_count() == 2)
}test {
let sets : @tree.DisjointSetMap[String] = @tree.DisjointSetMap::new()
assert_true(sets.union("a", "b"))
assert_true(sets.connected("a", "b"))
assert_true(!sets.connected("a", "c"))
}test {
let mut clock : Int64 = 0L
let cache : @cache.ExpiringCache[String, Int32] = @cache.ExpiringCache::new(
ttl=10L,
capacity=2,
now=() => clock,
)
let _ = cache.set("a", 1)
@test.assert_eq(cache.get("a"), Some(1))
clock = 11L
@test.assert_eq(cache.get("a"), None)
}test {
let fenwick : @tree.Fenwick[Int32] = @tree.Fenwick::new(length=5)
fenwick.add(0, 3)
fenwick.add(2, 4)
assert_true(fenwick.prefix_sum(3) == 7)
assert_true(fenwick.range_sum(1, 3) == 4)
let _ = fenwick.set(0, 10)
assert_true(fenwick.get(0) == Some(10))
assert_true(fenwick.lower_bound(5) == Some(0))
}test {
let heap : @heap.FibonacciHeap[Int32] = @heap.FibonacciHeap::new()
let a = heap.insert(5)
let _ = heap.insert(2)
let _ = heap.insert(8)
assert_true(heap.peek() == Some(2))
assert_true(heap.decrease_key(a, 1))
assert_true(heap.pop() == Some(1))
}test {
let map : @map.FlatMap[Int32, String] = @map.FlatMap::new()
let _ = map.set(2, "b")
let _ = map.set(1, "a")
@test.assert_eq(map.keys().to_array(), [1, 2])
@test.assert_eq(map.get(2), Some("b"))
@test.assert_eq(map.index_of(3), Err(2))
}test {
let map : @map.FlatMultiMap[Int32, String] = @map.FlatMultiMap::new()
map.insert(2, "b")
map.insert(1, "a")
map.insert(1, "c")
@test.assert_eq(map.get(1), ["a", "c"])
@test.assert_eq(map.length(), 3)
@test.assert_eq(map.key_count(), 2)
}test {
let set : @map.FlatSet[Int32] = @map.FlatSet::new()
@test.assert_eq(set.insert(3), true)
@test.assert_eq(set.insert(3), false)
@test.assert_eq(set.get_index(0), Some(3))
}test {
let buffer : @seq.GapBuffer[Int32] = @seq.GapBuffer::new()
buffer.insert(0, 1)
buffer.insert(1, 3)
buffer.insert(1, 2)
@test.assert_eq(buffer.to_array(), [1, 2, 3])
@test.assert_eq(buffer.remove(1), Some(2))
@test.assert_eq(buffer.to_array(), [1, 3])
}test {
let code : @algo.GrayCode = @algo.GrayCode::new(2)
@test.assert_eq(code.iter().take(4).to_array(), [
[false, false],
[false, true],
[true, true],
[true, false],
])
}test {
let log : @sketch.HyperLogLog[Int32] = @sketch.HyperLogLog::new(precision=12)
for i in 0..<1000 {
log.add(i)
}
let estimate = log.estimate()
assert_true(estimate > 900.0)
assert_true(estimate < 1100.0)
}test {
let heap : @heap.IndexHeap[Int32] = @heap.IndexHeap::new()
let a = heap.insert(5)
let b = heap.insert(1)
assert_true(heap.update(a, 0))
assert_true(heap.peek() == Some(0))
assert_true(heap.remove_at(b) == Some(1))
assert_true(heap.length() == 1)
}test {
let map : @map.IndexMap[String, Int32] = @map.IndexMap::new()
let _ = map.set("a", 1)
let _ = map.set("b", 2)
@test.assert_eq(map.get_index_of("b"), Some(1))
@test.assert_eq(map.get_index(0), Some(("a", 1)))
let _ = map.swap_remove("a")
@test.assert_eq(map.get_index(0), Some(("b", 2)))
}test {
let set : @map.IndexSet[Int32] = @map.IndexSet::new()
@test.assert_eq(set.insert(7), (0, true))
@test.assert_eq(set.insert(7), (0, false))
@test.assert_eq(set.get_index(0), Some(7))
}test {
let tree : @tree.IntervalTree[Int32, String] = @tree.IntervalTree::new()
let _ = tree.insert(start=0, end=10, "a")
let _ = tree.insert(start=5, end=15, "b")
assert_true(tree.query_point(7).length() == 2)
assert_true(tree.query_point(12).length() == 1)
assert_true(tree.query_point(20).length() == 0)
}test {
let kmp = @text.Kmp::new("ab")
assert_eq(kmp.search("cababc"), Some(1))
assert_eq(kmp.search_all("abab").to_array(), [0, 2])
}test {
let tree : @tree.LazySegmentTree[Int32, Int32] = @tree.LazySegmentTree::from_array(
[1, 1, 1, 1],
op=(a, b) => a + b,
identity=0,
apply=(tag, value, span) => value + tag * span,
compose=(older, newer) => older + newer,
none=0,
)
tree.range_update(1, 3, 5)
assert_true(tree.query(0, 4) == 14)
assert_true(tree.query(1, 2) == 6)
}test {
let cache : @cache.LfuCache[String, Int32] = @cache.LfuCache::new(capacity=2)
let _ = cache.set("a", 1)
let _ = cache.set("b", 2)
let _ = cache.get("a")
let _ = cache.set("c", 3)
@test.assert_eq(cache.get("b"), None)
@test.assert_eq(cache.frequency("a"), Some(2))
}test {
let list : @seq.LinkedList[Int32] = @seq.LinkedList::new()
list.push_back(1)
list.push_back(2)
list.push_front(0)
@test.assert_eq(list.to_array(), [0, 1, 2])
@test.assert_eq(list.pop_front(), Some(0))
@test.assert_eq(list.length(), 2)
}test {
let cache : @cache.LruCache[String, Int32] = @cache.LruCache::new(capacity=2)
let _ = cache.set("a", 1)
let _ = cache.set("b", 2)
let _ = cache.get("a")
let _ = cache.set("c", 3)
@test.assert_eq(cache.get("b"), None)
@test.assert_eq(cache.get("a"), Some(1))
}test {
let heap : @heap.MinMaxHeap[Int32] = @heap.MinMaxHeap::new()
for value in [5, 1, 9, 3, 7] {
heap.push(value)
}
assert_true(heap.peek_min() == Some(1))
assert_true(heap.peek_max() == Some(9))
assert_true(heap.pop_min() == Some(1))
assert_true(heap.pop_max() == Some(9))
}test {
let map : @map.MultiMap[String, Int32] = @map.MultiMap::new()
map.insert("a", 1)
map.insert("a", 2)
@test.assert_eq(map.get("a"), [1, 2])
@test.assert_eq(map.length(), 2)
@test.assert_eq(map.key_count(), 1)
}test {
let tree : @tree.OrderStatisticTree[Int32] = @tree.OrderStatisticTree::new()
for value in [5, 1, 9, 3] {
let _ = tree.insert(value)
}
assert_true(tree.select(0) == Some(1))
assert_true(tree.select(3) == Some(9))
assert_true(tree.rank(5) == 2)
assert_true(tree.count_range(2, 9) == 2)
}test {
let heap : @heap.PairingHeap[Int32] = @heap.PairingHeap::new()
let a = heap.insert(5)
let b = heap.insert(2)
let _ = heap.insert(9)
assert_true(heap.peek() == Some(2))
assert_true(heap.update(a, 1))
assert_true(heap.peek() == Some(1))
assert_true(heap.remove_at(b) == Some(2))
assert_true(heap.pop() == Some(1))
}test {
let permutations : @algo.Permutations[Int32] = @algo.Permutations::new(
[1, 2, 3],
length=2,
)
@test.assert_eq(permutations.iter().to_array(), [
[1, 2],
[1, 3],
[2, 1],
[2, 3],
[3, 1],
[3, 2],
])
}test {
let builder : @phf.PhfBuilder[String, Int32] = @phf.PhfBuilder::new()
builder.entry("x", 1)
let refused = try {
builder.entry("x", 2)
Ok(())
} catch {
@spec.Refused::DuplicateValue => Err(true)
_ => Err(false)
}
assert_true(refused == Err(true))
}test {
let builder : @phf.PhfBuilder[String, Int32] = @phf.PhfBuilder::new()
builder.entry("a", 1)
builder.entry("b", 2)
let table = builder.build()
assert_true(table.get("a") == Some(1))
assert_true(table.get("b") == Some(2))
assert_true(table.get("c") == None)
assert_true(table.length() == 2)
}test {
let builder : @phf.PhfBuilder[String, Int32] = @phf.PhfBuilder::new()
builder.entry("b", 2)
builder.entry("a", 1)
let table = builder.build_ordered()
assert_true(table.index("b") == Some(0))
assert_true(table.index("a") == Some(1))
assert_true(table.get("a") == Some(1))
}test {
let builder : @phf.PhfBuilder[String, Unit] = @phf.PhfBuilder::new()
builder.entry("in", ())
let set = builder.build_set()
assert_true(set.contains("in"))
assert_true(!set.contains("out"))
}test {
let powerset : @algo.Powerset[Int32] = @algo.Powerset::new([1, 2])
@test.assert_eq(powerset.iter().to_array(), [[], [1], [2], [1, 2]])
}test {
let pools : Array[ArrayView[Int32]] = [[1, 2][:], [3, 4][:]]
let product : @algo.Product[Int32] = @algo.Product::new(pools)
@test.assert_eq(product.iter().to_array(), [[1, 3], [1, 4], [2, 3], [2, 4]])
}test {
let heap : @heap.RadixHeap[String] = @heap.RadixHeap::new()
heap.push(5UL, "five")
heap.push(1UL, "one")
heap.push(9UL, "nine")
assert_true(heap.pop_min() == Some((1UL, "one")))
assert_true(heap.pop_min() == Some((5UL, "five")))
}test {
let tree : @map.RadixTree[Int32] = @map.RadixTree::new()
@test.assert_eq(tree.insert("car", 1), None)
@test.assert_eq(tree.insert("cart", 2), None)
@test.assert_eq(tree.insert("cat", 3), None)
@test.assert_eq(tree.get("cart"), Some(2))
@test.assert_eq(tree.get_ancestor_keys("cartoon"), ["car", "cart"])
@test.assert_eq(tree.prefix_count("ca"), 3)
}test {
let map : @map.RangeMap[Int32, String] = @map.RangeMap::new()
map.insert(start=0, end=10, "low")
map.insert(start=10, end=20, "high")
@test.assert_eq(map.get(5), Some("low"))
@test.assert_eq(map.get(10), Some("high"))
@test.assert_eq(map.get(20), None)
@test.assert_eq(map.length(), 2)
}test {
let set : @map.RangeSet[Int32] = @map.RangeSet::new()
set.insert(start=0, end=5)
set.insert(start=5, end=9)
@test.assert_eq(set.contains(7), true)
@test.assert_eq(set.contains(9), false)
@test.assert_eq(set.length(), 1)
}test {
let rope : @text.Rope = @text.Rope::from_string("hello world")
rope.insert(5, ",")
assert_true(rope.to_string() == "hello, world")
rope.edit(start=0, end=5, "goodbye")
assert_true(rope.to_string() == "goodbye, world")
assert_true(rope.length() == 14)
}test {
let builder : @text.RopeBuilder = @text.RopeBuilder::new()
builder.append("one ")
builder.append("two")
let rope = builder.finish()
assert_true(rope.to_string() == "one two")
}test {
let rope : @text.Rope = @text.Rope::from_string("abcdef")
let window = rope.slice(start=2, end=4)
assert_true(window.to_string() == "cd")
assert_true(window.length() == 2)
}test {
let tree : @tree.SegmentTree[Int32] = @tree.SegmentTree::from_array(
[3, 1, 4, 1, 5],
op=(a, b) => a + b,
identity=0,
)
assert_true(tree.query(0, 3) == 8)
assert_true(tree.query_all() == 14)
let _ = tree.set(1, 10)
assert_true(tree.query(0, 3) == 17)
assert_true(tree.first_where(x => x >= 17) == Some(2))
}test {
let left : Array[Char] = "abcd".iter().to_array()
let right : Array[Char] = "bcde".iter().to_array()
let matcher : @text.SequenceMatcher[Char] = @text.SequenceMatcher::new(
left[:],
right[:],
)
@test.assert_eq(matcher.ratio() > 0.7, true)
let blocks = matcher.get_matching_blocks()
@test.assert_eq(blocks.length(), 2)
}test {
let list : @tree.SkipList[Int32] = @tree.SkipList::new()
for value in [5, 1, 9, 3] {
let _ = list.insert(value)
}
assert_true(list.to_array() == [1, 3, 5, 9])
assert_true(list.rank(5) == 2)
assert_true(list.select(2) == Some(5))
}test {
let map : @map.SortedMultiMap[Int32, String] = @map.SortedMultiMap::new()
map.insert(2, "b")
map.insert(1, "a")
map.insert(1, "b")
@test.assert_eq(map.first(), Some((1, "a")))
@test.assert_eq(map.get(1), ["a", "b"])
}test {
let set : @seq.SparseSet[String] = @seq.SparseSet::new()
@test.assert_eq(set.insert("a"), true)
@test.assert_eq(set.insert("a"), false)
@test.assert_eq(set.contains("a"), true)
@test.assert_eq(set.to_array(), ["a"])
}test {
let array : @text.SuffixArray = @text.SuffixArray::new("banana")
@test.assert_eq(array.search("ana"), [1, 3])
@test.assert_eq(array.length(), 6)
}test {
let automaton : @text.SuffixAutomaton = @text.SuffixAutomaton::new("banana")
@test.assert_eq(automaton.contains("ana"), true)
@test.assert_eq(automaton.count_occurrences("ana"), 2)
@test.assert_eq(automaton.contains("band"), false)
}test {
let digest : @sketch.TDigest = @sketch.TDigest::new()
for i in 0..<1000 {
digest.add(i.to_double())
}
let median = digest.quantile(0.5)
assert_true(median > 450.0)
assert_true(median < 550.0)
assert_true(digest.count() == 1000.0)
}test {
let sketch : @sketch.ThetaSketch[Int32] = @sketch.ThetaSketch::new(
nominal_entries=1024,
)
for i in 0..<500 {
sketch.add(i)
}
assert_true(sketch.estimate() > 450.0)
assert_true(sketch.estimate() < 550.0)
}test {
let tree : @tree.Treap[Int32, String] = @tree.Treap::new()
let _ = tree.set(2, "b")
let _ = tree.set(1, "a")
let _ = tree.set(3, "c")
assert_true(tree.get(2) == Some("b"))
assert_true(tree.to_array() == [(1, "a"), (2, "b"), (3, "c")])
assert_true(tree.remove(2) == Some("b"))
}test {
let trie : @map.Trie[Int32] = @map.Trie::new()
@test.assert_eq(trie.insert("car", 1), None)
@test.assert_eq(trie.insert("cart", 2), None)
@test.assert_eq(trie.get("car"), Some(1))
@test.assert_eq(trie.keys_with_prefix("ca"), ["car", "cart"])
@test.assert_eq(trie.longest_prefix("cartoon"), Some(("cart", 2)))
}Install
Download zipData structures and algorithms the MoonBit core library leaves out.