add functions to move around in gap set
This commit is contained in:
@@ -18,6 +18,10 @@ sig
|
|||||||
val insert: Fn.key * t -> t
|
val insert: Fn.key * t -> t
|
||||||
|
|
||||||
val fromList: Fn.key list -> t
|
val fromList: Fn.key list -> t
|
||||||
|
|
||||||
|
val moveToStart: t -> t
|
||||||
|
val moveToEnd: t -> t
|
||||||
|
val moveTo: Fn.key * t -> t
|
||||||
end
|
end
|
||||||
|
|
||||||
functor MakeGapSet(Fn: GAP_SET_ELEMENT): GAP_SET =
|
functor MakeGapSet(Fn: GAP_SET_ELEMENT): GAP_SET =
|
||||||
@@ -228,4 +232,62 @@ struct
|
|||||||
case lst of
|
case lst of
|
||||||
hd :: tl => let val acc = insert (hd, acc) in helpFromList (tl, acc) end
|
hd :: tl => let val acc = insert (hd, acc) in helpFromList (tl, acc) end
|
||||||
| [] => acc
|
| [] => acc
|
||||||
|
|
||||||
|
fun fromList lst =
|
||||||
|
helpFromList (lst, {left = [], right = []})
|
||||||
|
|
||||||
|
fun helpMoveToStart (left, right) =
|
||||||
|
case left of
|
||||||
|
hd :: tl => helpMoveToStart (tl, joinStartOfRight (hd, right))
|
||||||
|
| [] => {left = left, right = right}
|
||||||
|
|
||||||
|
fun moveToStart {left, right} =
|
||||||
|
case left of
|
||||||
|
hd :: tl => helpMoveToStart (tl, joinStartOfRight (hd, right))
|
||||||
|
| [] => {left = left, right = right}
|
||||||
|
|
||||||
|
fun helpMoveToEnd (left, right) =
|
||||||
|
case right of
|
||||||
|
hd :: tl => helpMoveToEnd (joinEndOfLeft (hd, left), tl)
|
||||||
|
| [] => {left = left, right = right}
|
||||||
|
|
||||||
|
fun moveToEnd {left, right} =
|
||||||
|
case right of
|
||||||
|
hd :: tl => helpMoveToEnd (joinEndOfLeft (hd, left), tl)
|
||||||
|
| [] => {left = left, right = right}
|
||||||
|
|
||||||
|
fun moveLeft (to, left, right) =
|
||||||
|
case left of
|
||||||
|
hd :: tl =>
|
||||||
|
let
|
||||||
|
val first = Vector.sub (hd, 0)
|
||||||
|
in
|
||||||
|
if Fn.l (to, first) then
|
||||||
|
moveLeft (to, tl, joinStartOfRight (hd, right))
|
||||||
|
else
|
||||||
|
{left = left, right = right}
|
||||||
|
end
|
||||||
|
| [] => {left = left, right = right}
|
||||||
|
|
||||||
|
fun moveRight (to, left, right) =
|
||||||
|
case right of
|
||||||
|
hd :: tl =>
|
||||||
|
let
|
||||||
|
val last = Vector.sub (hd, Vector.length hd - 1)
|
||||||
|
in
|
||||||
|
if Fn.g (to, last) then moveRight (to, joinEndOfLeft (hd, left), tl)
|
||||||
|
else {left = left, right = right}
|
||||||
|
end
|
||||||
|
| [] => {left = left, right = right}
|
||||||
|
|
||||||
|
fun moveTo (to, {left, right}) =
|
||||||
|
case right of
|
||||||
|
hd :: _ =>
|
||||||
|
let
|
||||||
|
val rfist = Vector.sub (hd, 0)
|
||||||
|
in
|
||||||
|
if Fn.g (to, rfist) then moveRight (to, left, right)
|
||||||
|
else if Fn.l (to, rfist) then moveLeft (to, left, right)
|
||||||
|
else {left = left, right = right}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user