@@ -6,14 +6,14 @@ fun println x = print $ x ^ "\n"
66fun splitWith pred list =
77 let
88 fun acc done [] [] = done
9- | acc done last [] = last :: done
9+ | acc done last [] = List.rev last :: done
1010 | acc done last (x :: xs) =
1111 if pred x then
12- acc (last :: done) [] xs
12+ acc (List.rev last :: done) [] xs
1313 else
1414 acc done (x :: last) xs
1515 in
16- acc [] [] list
16+ List.rev $ acc [] [] list
1717 end
1818
1919fun foldl ' f (x :: xs) = List.foldl f x xs
@@ -22,6 +22,7 @@ fun foldl' f (x :: xs) = List.foldl f x xs
2222val listSum = List.foldl (op +) 0
2323val listProduct = List.foldl (op *) 1
2424
25+
2526signature ORD =
2627sig
2728 type t
3738 val empty : 'a Coll
3839 val lookup : K -> 'a Coll -> 'a option
3940 val insert : K -> 'a -> 'a Coll -> 'a Coll
41+ val update : ('a option -> 'a) -> K -> 'a Coll -> 'a Coll
42+ val updateWithDefault : 'a -> ('a -> 'a) -> K -> 'a Coll -> 'a Coll
4043 val foldl : (K * 'a * 'b -> 'b) -> 'b -> 'a Coll -> 'b
4144 val size : 'a Coll -> int
4245 val fromList : (K * 'a) list -> 'a Coll
@@ -83,6 +86,13 @@ fun insert k v s =
8386 T (B, a, y, b)
8487 end
8588
89+ fun update f k coll =
90+ insert k (f $ lookup k coll) coll
91+
92+ fun updateWithDefault default f k coll =
93+ update (fn v => f $ getOpt (v, default)) k coll
94+
95+
8696fun foldl f acc E = acc
8797 | foldl f acc (T(_, a, (k, v), b)) =
8898 let
@@ -97,7 +107,6 @@ fun size coll = foldl (fn (_, _, n) => n + 1) 0 coll
97107fun fromList list = List.foldl (fn ((k, v), s) => insert k v s) empty list
98108end
99109
100-
101110signature SET =
102111sig
103112 type V
@@ -136,3 +145,11 @@ structure CharMap = Map(
136145 end )
137146
138147structure CharSet = Set(CharMap)
148+
149+ structure StringMap = Map(
150+ struct
151+ type t = string
152+ val cmp = String.compare
153+ end )
154+
155+ structure StringSet = Set(StringMap)
0 commit comments