summaryrefslogtreecommitdiff
path: root/tree.sml
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-05-18 14:17:50 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-05-18 14:17:50 +0200
commitd289f01594024a8fe64aeed56721260fab6b4e50 (patch)
tree204b160e1fb1d3325cc493db1d84b351dfb621a6 /tree.sml
parent183a4420d2f2a985dd26d76e63c2cdcaafedc5ad (diff)
#else, #elif (rudimentary) support
Diffstat (limited to 'tree.sml')
-rw-r--r--tree.sml20
1 files changed, 14 insertions, 6 deletions
diff --git a/tree.sml b/tree.sml
index 597e469..57e9a24 100644
--- a/tree.sml
+++ b/tree.sml
@@ -1,16 +1,24 @@
structure Tree: TREE = struct
datatype ('k, 'v) t = Node of 'k * 'v * ('k, 'v) t * ('k, 'v) t | Empty
- exception Exists
-
val empty = Empty
- fun insert _ Empty k v = Node (k, v, Empty, Empty)
+ fun insert _ Empty k v = (NONE, Node (k, v, Empty, Empty))
| insert cmp (Node (k', v', left, right)) k v =
case cmp k k' of
- LESS => Node (k', v', insert cmp left k v, right)
- | EQUAL => raise Exists
- | GREATER => Node (k', v', left, insert cmp right k v)
+ LESS =>
+ let
+ val (res, left) = insert cmp left k v
+ in
+ (res, Node (k', v', left, right))
+ end
+ | EQUAL => (SOME v', Node (k, v, left, right))
+ | GREATER =>
+ let
+ val (res, right) = insert cmp right k v
+ in
+ (res, Node (k', v', left, right))
+ end
fun lookup _ Empty _ = NONE
| lookup cmp (Node (k', v', left, right)) k =