format rope.sml using smlfmt

This commit is contained in:
2024-03-13 06:33:51 +00:00
parent 8177c99ef7
commit 84d6dacdeb
4 changed files with 175 additions and 239 deletions

BIN
.DS_Store vendored

Binary file not shown.

Binary file not shown.

222
rope.sml
View File

@@ -1,4 +1,5 @@
signature ROPE = sig
signature ROPE =
sig
type t
val empty: t
val fromString: string -> t
@@ -8,9 +9,10 @@ signature ROPE = sig
val toString: t -> string
end
structure Rope :> ROPE = struct
datatype t
= N0 of string
structure Rope :> ROPE =
struct
datatype t =
N0 of string
| N1 of t
| N2 of t * int * t
| L2 of string * string
@@ -23,29 +25,19 @@ structure Rope :> ROPE = struct
fun foldr (f, state, rope) =
case rope of
N2 (l, _, r) =>
let
val state = foldr(f, state, r)
in
foldr(f, state, l)
let val state = foldr (f, state, r)
in foldr (f, state, l)
end
| N1 t =>
foldr(f, state, t)
| N0 s =>
f (state, s)
| _ =>
raise AuxConstructor
| N1 t => foldr (f, state, t)
| N0 s => f (state, s)
| _ => raise AuxConstructor
fun toString rope =
let
val strList = foldr((fn (acc, str) => str::acc), [], rope)
in
String.concat strList
let val strList = foldr ((fn (acc, str) => str :: acc), [], rope)
in String.concat strList
end
datatype balance
= AddedNode
| DeletedNode
| NoAction
datatype balance = AddedNode | DeletedNode | NoAction
val targetLength = 1024
val empty = N0 ""
@@ -56,28 +48,21 @@ structure Rope :> ROPE = struct
fun helpSize (acc, rope) =
case rope of
N0 s =>
acc + String.size s
| N1 t =>
helpSize(acc, t)
| N2(_, lm, r) =>
helpSize(acc + lm, r)
N0 s => acc + String.size s
| N1 t => helpSize (acc, t)
| N2 (_, lm, r) => helpSize (acc + lm, r)
| _ => raise AuxConstructor
fun size rope = helpSize (0, rope)
fun insRoot rope =
case rope of
L2(s1, s2) =>
N2(N0 s1, String.size s1, N0 s2)
L2 (s1, s2) => N2 (N0 s1, String.size s1, N0 s2)
| N3 (t1, t2, t3) =>
let
val left = N2(t1, size t1, t2)
in
N2(left, size left, N1 t3)
let val left = N2 (t1, size t1, t2)
in N2 (left, size left, N1 t3)
end
| t =>
t
| t => t
fun delRoot rope =
case rope of
@@ -86,21 +71,16 @@ structure Rope :> ROPE = struct
fun insN1 rope =
case rope of
L2 (s1, s2) =>
N2(N0 s1, String.size s1, N0 s2)
L2 (s1, s2) => N2 (N0 s1, String.size s1, N0 s2)
| N3 (t1, t2, t3) =>
let
val left = N2(t1, size t1, t2)
in
N2(left, size left, N1 t3)
let val left = N2 (t1, size t1, t2)
in N2 (left, size left, N1 t3)
end
| t =>
N1 t
| t => N1 t
fun insN2Left (left, right) =
case (left, right) of
(L2(s1, s2), t3) =>
N3(N0 s1, N0 s2, t3)
(L2 (s1, s2), t3) => N3 (N0 s1, N0 s2, t3)
| (N3 (t1, t2, t3), N1 t4) =>
let
val left = N2 (t1, size t1, t2)
@@ -109,18 +89,14 @@ structure Rope :> ROPE = struct
N2 (left, size left, right)
end
| (N3 (t1, t2, t3), t4) =>
let
val left = N2(t1, size t1, t2)
in
N3(left, N1 t3, t4)
let val left = N2 (t1, size t1, t2)
in N3 (left, N1 t3, t4)
end
| (l, r) =>
N2(l, size l, r)
| (l, r) => N2 (l, size l, r)
fun delN2Left (left, right) =
case (left, right) of
(N1 t1, N1 t2) =>
N1(N2(t1, size t1, t2))
(N1 t1, N1 t2) => N1 (N2 (t1, size t1, t2))
| (N1 (N1 t1), N2 (N1 t2, _, (t3 as N2 _))) =>
let
val left = N2 (t1, size t1, t2)
@@ -143,13 +119,11 @@ structure Rope :> ROPE = struct
in
N2 (left, size left, right)
end
| (l, r) =>
N2(l, size l, r)
| (l, r) => N2 (l, size l, r)
fun insN2Right (left, right) =
case (left, right) of
(t1, L2(s1, s2)) =>
N3(t1, N0 s1, N0 s2)
(t1, L2 (s1, s2)) => N3 (t1, N0 s1, N0 s2)
| (N1 t1, N3 (t2, t3, t4)) =>
let
val left = N2 (t1, size t1, t2)
@@ -158,13 +132,10 @@ structure Rope :> ROPE = struct
N2 (left, size left, right)
end
| (t1, N3 (t2, t3, t4)) =>
let
val right = N2(t3, size t3, t4)
in
N3(t1, N1 t2, right)
let val right = N2 (t3, size t3, t4)
in N3 (t1, N1 t2, right)
end
| (l, r) =>
N2(l, size l, r)
| (l, r) => N2 (l, size l, r)
fun delN2Right (left, right) =
case (left, right) of
@@ -190,20 +161,15 @@ structure Rope :> ROPE = struct
in
N2 (left, size left, right)
end
| (l, r) =>
N2(l, size l, r)
| (l, r) => N2 (l, size l, r)
fun insLeaf (curIdx, newStr, rope, oldStr) =
if curIdx <= 0 then
if isLessThanTarget(oldStr, newStr) then
(N0(newStr ^ oldStr), NoAction)
else
(L2(newStr, oldStr), AddedNode)
if isLessThanTarget (oldStr, newStr) then (N0 (newStr ^ oldStr), NoAction)
else (L2 (newStr, oldStr), AddedNode)
else if curIdx >= String.size oldStr then
if isLessThanTarget(oldStr, newStr) then
(N0(oldStr ^ newStr), NoAction)
else
(L2(oldStr, newStr), AddedNode)
if isLessThanTarget (oldStr, newStr) then (N0 (oldStr ^ newStr), NoAction)
else (L2 (oldStr, newStr), AddedNode)
else
(* Need to split in middle of string. *)
let
@@ -211,11 +177,17 @@ structure Rope :> ROPE = struct
val sub2Len = String.size oldStr - curIdx
val sub2 = String.substring (oldStr, curIdx, sub2Len)
in
if isLessThanTarget(oldStr, newStr) then
if
isLessThanTarget (oldStr, newStr)
then
(N0 (sub1 ^ newStr ^ sub2), NoAction)
else if curIdx + String.size newStr <= targetLength then
else if
curIdx + String.size newStr <= targetLength
then
(L2 (sub1 ^ newStr, sub2), AddedNode)
else if ((String.size oldStr) - curIdx) + String.size newStr <= targetLength then
else if
((String.size oldStr) - curIdx) + String.size newStr <= targetLength
then
(L2 (sub1, newStr ^ sub2), AddedNode)
else
(N3 (N0 sub1, N0 newStr, N0 sub2), AddedNode)
@@ -236,12 +208,9 @@ structure Rope :> ROPE = struct
(N0 (s1 ^ s2), DeletedNode)
else
(N2 (l, lm + String.size newStr, r), action)
| _ =>
(N2(l, lm + String.size newStr, r), action))
| AddedNode =>
(insN2Left(l, r), action)
| DeletedNode =>
(delN2Left(l, r), action))
| _ => (N2 (l, lm + String.size newStr, r), action))
| AddedNode => (insN2Left (l, r), action)
| DeletedNode => (delN2Left (l, r), action))
end
else
let
@@ -255,39 +224,29 @@ structure Rope :> ROPE = struct
(N0 (s1 ^ s2), DeletedNode)
else
(N2 (l, lm, r), action)
| _ =>
(N2(l, lm, r), action))
| AddedNode =>
(insN2Right(l, r), action)
| DeletedNode =>
(delN2Right(l, r), action))
| _ => (N2 (l, lm, r), action))
| AddedNode => (insN2Right (l, r), action)
| DeletedNode => (delN2Right (l, r), action))
end
| N1 t =>
let
val (t, action) = ins (curIdx, newStr, t)
in
(case action of
AddedNode =>
(insN1 t, action)
| _ =>
(N1 t, action))
AddedNode => (insN1 t, action)
| _ => (N1 t, action))
end
| N0 oldStr =>
insLeaf(curIdx, newStr, rope, oldStr)
| _ =>
raise AuxConstructor
| N0 oldStr => insLeaf (curIdx, newStr, rope, oldStr)
| _ => raise AuxConstructor
fun insert (index, str, rope) =
let
val (rope, action) = ins (index, str, rope)
in
(case action of
NoAction =>
rope
| AddedNode =>
insRoot rope
| DeletedNode =>
delRoot rope)
NoAction => rope
| AddedNode => insRoot rope
| DeletedNode => delRoot rope)
end
fun delLeaf (startIdx, endIdx, str) =
@@ -298,10 +257,8 @@ structure Rope :> ROPE = struct
val sub1 = String.substring (str, 0, startIdx)
val sub2 = String.substring (str, endIdx, (String.size str - endIdx))
in
if isLessThanTarget(sub1, sub2) then
(N0 (sub1 ^ sub2), false)
else
(L2(sub1, sub2), true)
if isLessThanTarget (sub1, sub2) then (N0 (sub1 ^ sub2), false)
else (L2 (sub1, sub2), true)
end
else if startIdx >= 0 andalso endIdx >= String.size str then
let
@@ -311,10 +268,8 @@ structure Rope :> ROPE = struct
(N0 str, false)
end
else
let
val str = String.substring(str, endIdx, String.size str - endIdx)
in
(N0 str, false)
let val str = String.substring (str, endIdx, String.size str - endIdx)
in (N0 str, false)
end
fun del (startIdx, endIdx, rope) =
@@ -324,53 +279,34 @@ structure Rope :> ROPE = struct
let
val (l, didAdd) = del (startIdx, endIdx, l)
in
if didAdd then
(insN2Left(l, r), didAdd)
else
(N2(l, size l, r), didAdd)
if didAdd then (insN2Left (l, r), didAdd)
else (N2 (l, size l, r), didAdd)
end
else if lm < startIdx andalso lm < endIdx then
let
val (r, didAdd) = del (startIdx - lm, endIdx - lm, r)
in
if didAdd then
(insN2Right(l, r), didAdd)
else
(N2(l, lm, r), didAdd)
if didAdd then (insN2Right (l, r), didAdd)
else (N2 (l, lm, r), didAdd)
end
else
let
val (r, didAddR) = del (startIdx - lm, endIdx - lm, r)
val (l, didaddL) = del (startIdx, endIdx, l)
in
if didaddL then
(insN2Left(l, r), didaddL)
else if didAddR then
(insN2Right(l, r), didAddR)
else
(N2(l, size l, r), false)
if didaddL then (insN2Left (l, r), didaddL)
else if didAddR then (insN2Right (l, r), didAddR)
else (N2 (l, size l, r), false)
end
| N1 t =>
let
val (t, didAdd) = del(startIdx, endIdx, t)
in
if didAdd then
(insN1 t, didAdd)
else
(N1 t, didAdd)
let val (t, didAdd) = del (startIdx, endIdx, t)
in if didAdd then (insN1 t, didAdd) else (N1 t, didAdd)
end
| N0 str =>
delLeaf(startIdx, endIdx, str)
| _ =>
raise AuxConstructor
| N0 str => delLeaf (startIdx, endIdx, str)
| _ => raise AuxConstructor
fun delete (start, length, rope) =
let
val (rope, didAdd) = del(start, start + length, rope)
in
if didAdd then
insRoot rope
else
delRoot rope
let val (rope, didAdd) = del (start, start + length, rope)
in if didAdd then insRoot rope else delRoot rope
end
end

View File

@@ -41,7 +41,7 @@ fun run_txns_time title arr =
end
fun run_to_string rope =
Rope.to_string rope
Rope.toString rope
fun run_to_string_time title rope =
let