summaryrefslogtreecommitdiff
path: root/tree.sml
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-08-01 19:26:54 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-08-01 19:26:54 +0200
commitb3f8ca28af653dcb5fdc10e8c70439d86c043635 (patch)
tree168ef8c424c4688d3ae5fdcb30ecb10d81eeca35 /tree.sml
parent0a091754ea2d9944e35215d67604c58c6f874cbd (diff)
Remove fp support
Diffstat (limited to 'tree.sml')
-rw-r--r--tree.sml28
1 files changed, 16 insertions, 12 deletions
diff --git a/tree.sml b/tree.sml
index c97edfb..678ebe8 100644
--- a/tree.sml
+++ b/tree.sml
@@ -71,24 +71,25 @@ structure Tree: TREE = struct
Left of 'k * 'v * ('k, 'v) t |
Right of 'k * 'v * ('k, 'v) t
- fun assemble n buf =
+ fun assemble buf n =
let
- fun assemble' tree (Left (k, v, right) :: tail) =
- assemble' (Node (k, v, tree, right)) tail
- | assemble' tree (Right (k, v, left) :: tail) =
- assemble' (Node (k, v, left, tree)) tail
- | assemble' tree [] = tree
+ fun assemble' (Left (k, v, right) :: tail) tree =
+ assemble' tail (Node (k, v, tree, right))
+ | assemble' (Right (k, v, left) :: tail) tree =
+ assemble' tail (Node (k, v, left, tree))
+ | assemble' [] tree = tree
in
- assemble' n buf
+ assemble' buf n
end
- fun lookup' _ _ Empty k f =
+ fun lookup' buf _ Empty k f =
let
val (res, newV) = f NONE
in
- case newV of
- NONE => (res, Empty)
- | SOME v => (res, Node (k, v, Empty, Empty))
+ (res, assemble buf
+ (case newV of
+ NONE => Empty
+ | SOME v => Node (k, v, Empty, Empty)))
end
| lookup' buf cmp (T as Node (k', v', left, right)) k f =
case cmp k k' of
@@ -100,7 +101,7 @@ structure Tree: TREE = struct
in
case newV of
NONE => (res, T)
- | SOME v => (res, assemble (Node (k', v, left, right)) buf)
+ | SOME v => (res, assemble buf (Node (k', v, left, right)))
end
fun lookup2 cmp t k f = lookup' [] cmp t k f
@@ -120,4 +121,7 @@ structure Tree: TREE = struct
in
print' 0 t
end
+
+ fun size Empty = 0
+ | size (Node(_, _, l, r)) = 1 + size l + size r
end