moonbitstack/moonstl/tree does not have a README file
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 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 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 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)
}fn[K, V] IntervalTree::insert(self : IntervalTree[K, V], start~ : K, end~ : K, value : V) -> IntervalKey[K]fn[K, V] IntervalTree::query_overlap(self : IntervalTree[K, V], start~ : K, end~ : K) -> Array[(K, K, V)]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)
}fn[T, F] LazySegmentTree::from_array(values : ArrayView[T], op~ : (T, T) -> T, identity~ : T, apply~ : (F, T, Int) -> T, compose~ : (F, F) -> F, none~ : F) -> LazySegmentTree[T, F]fn[T, F] LazySegmentTree::new(length~ : Int, op~ : (T, T) -> T, identity~ : T, apply~ : (F, T, Int) -> T, compose~ : (F, F) -> F, none~ : F) -> LazySegmentTree[T, F]fn[T, F] LazySegmentTree::range_update(self : LazySegmentTree[T, F], start : Int, end : Int, tag : F) -> Unittest {
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 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))
}fn[T] SegmentTree::from_array(values : ArrayView[T], op~ : (T, T) -> T, identity~ : T) -> SegmentTree[T]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 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"))
}Install
Download zipData structures and algorithms the MoonBit core library leaves out.