add functor to fold over GapMap in gap_map.sml
This commit is contained in:
@@ -37,6 +37,71 @@ sig
|
|||||||
val moveTo: Fn.key * t -> t
|
val moveTo: Fn.key * t -> t
|
||||||
end
|
end
|
||||||
|
|
||||||
|
signature GAP_MAP_FOLDER =
|
||||||
|
sig
|
||||||
|
structure Pair: GAP_MAP_PAIR
|
||||||
|
type env
|
||||||
|
type state
|
||||||
|
val fold: Pair.key * Pair.value * env * state -> state
|
||||||
|
end
|
||||||
|
|
||||||
|
signature MAKE_GAP_MAP_FOLDER =
|
||||||
|
sig
|
||||||
|
structure Pair: GAP_MAP_PAIR
|
||||||
|
structure Folder: GAP_MAP_FOLDER
|
||||||
|
|
||||||
|
type env = Folder.env
|
||||||
|
type state = Folder.state
|
||||||
|
|
||||||
|
type t =
|
||||||
|
{ leftKeys: Pair.key vector list
|
||||||
|
, leftVals: Pair.value vector list
|
||||||
|
, rightKeys: Pair.key vector list
|
||||||
|
, rightVals: Pair.value vector list
|
||||||
|
}
|
||||||
|
|
||||||
|
val foldUnordered: t * env * state -> state
|
||||||
|
end
|
||||||
|
|
||||||
|
functor MakeGapMapFolder(Folder: GAP_MAP_FOLDER): MAKE_GAP_MAP_FOLDER =
|
||||||
|
struct
|
||||||
|
structure Pair = Folder.Pair
|
||||||
|
structure Folder = Folder
|
||||||
|
|
||||||
|
type env = Folder.env
|
||||||
|
type state = Folder.state
|
||||||
|
|
||||||
|
type t =
|
||||||
|
{ leftKeys: Pair.key vector list
|
||||||
|
, leftVals: Pair.value vector list
|
||||||
|
, rightKeys: Pair.key vector list
|
||||||
|
, rightVals: Pair.value vector list
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foldVecUnordered (pos, keys, values, env, state) =
|
||||||
|
if pos = Vector.length keys then
|
||||||
|
state
|
||||||
|
else
|
||||||
|
let
|
||||||
|
val key = Vector.sub (keys, pos)
|
||||||
|
val value = Vector.sub (values, pos)
|
||||||
|
val state = Folder.fold (key, value, env, state)
|
||||||
|
in
|
||||||
|
foldVecUnordered (pos + 1, keys, values, env, state)
|
||||||
|
end
|
||||||
|
|
||||||
|
fun foldListUnodered (khd :: ktl, vhd :: vtl, env, state) =
|
||||||
|
let val state = foldVecUnordered (0, khd, vhd, env, state)
|
||||||
|
in foldListUnodered (ktl, vtl, env, state)
|
||||||
|
end
|
||||||
|
| foldListUnodered (_, _, _, state) = state
|
||||||
|
|
||||||
|
fun foldUnordered ({leftKeys, leftVals, rightKeys, rightVals}, env, state) =
|
||||||
|
let val state = foldListUnodered (leftKeys, leftVals, env, state)
|
||||||
|
in foldListUnodered (rightKeys, rightVals, env, state)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
signature MAP =
|
signature MAP =
|
||||||
sig
|
sig
|
||||||
structure Pair: GAP_MAP_PAIR
|
structure Pair: GAP_MAP_PAIR
|
||||||
|
|||||||
Reference in New Issue
Block a user