From 84d6dacdebde2e2f9460e269438b16c37c0315bc Mon Sep 17 00:00:00 2001 From: humzashahid Date: Wed, 13 Mar 2024 06:33:51 +0000 Subject: [PATCH] format rope.sml using smlfmt --- .DS_Store | Bin 6148 -> 6148 bytes .rope.sml.swp | Bin 20480 -> 0 bytes rope.sml | 412 +++++++++++++++++++++----------------------------- utils.sml | 2 +- 4 files changed, 175 insertions(+), 239 deletions(-) delete mode 100644 .rope.sml.swp diff --git a/.DS_Store b/.DS_Store index 13aadb5b59c834312f4dcb5531971feabbe86a87..22b9a695f5b9bfcad4797e3d8221e75627f66ab9 100644 GIT binary patch delta 37 tcmZoMXffEJ&pJ7tbpkgpLkUABLmopVL;PeNR{hQIS^1bYvvd6A2LQ;o3Wopy delta 28 kcmZoMXffEJ&pP=mtIlL?)+w8Rvhp!aY~b3=&heKY0Fu)Q-v9sr diff --git a/.rope.sml.swp b/.rope.sml.swp deleted file mode 100644 index 38d7d9319cfb857b6d262a35246952fc0524d7f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI2S&S4#7{^OI@WKP5hN!W`gI(maMDVT^F4&1;Ro9Dl9qTI>`z_+uYgy; zE8rFI3U~#)0$u^HfLFjP;1%!+j6#8cMf$mWDz(D|Zf5=8egA*Ew^AG7ZFmB1hb3?| zTn4k@XqXBI!36kqFQqoYd+;u-ho|9ASP6?@Hk<)Rz%HT`Gw9*0%19D3m_=!8RINBDKTQXj)QxCJUO z7c~5|3-yKduo`ZFYv2-C06lOd{IauBAHtjP6s(2AKV2R*cg7uL?@_TXc_(Gv;P}w2rgpswrhXM@gDXlXkaBN-8QA=cc*DTqJ4b!c|9W zsfCT;7O6cyn@V)eU;5{WzMG>_8Oorq$ILrENu^$9KBq}d-PK12-7I9Bmm zsXt7e$?!@z=km{*h_&dk8%I*h-Qq~ttnesC9Bo_9TB|Lr?U2*jJmOut)0XL|dlDKq zC*k5v8a;^#r_8N-6Z2%|pOap^$&hA%B~yyE6>l2nMsOEt7nOT*ZHB$A59?#p9Dk`b znj53uS8=yi@_BK!7%iS*I-EH3rr&hH)VXV2Z#og!wUBJdb#6Y&X!Em2H?&034E07B z=>>44CP+PndFQgPaL(-9Th+F{6}oiRF>4MSO7c24f<+IxAX(qy<2Vf;s1S{(Nilj+KKCr#U%qjx2ZJ+<+~BM#9eCDN8M)fJH_*>GDiiuF_)SpJIu z=3cy=&6uCmFU?3T3gRGMO1E}m$@l+he21?E`Tlq7@4xXqzZrgjPv8xB8DuWt0k{=p zJ|Kb%;B3gi6xa)7KHwMf{2tzix8Mbka-IQycm=!yUIDLwSHLUa74Qmp1-t@Y0k42p zU@HnR0pO-T<|R{Hg-TQiVqL1qgp{4^Fw;UcS&@s)B!FIUsrx{d`DR(VNFtacvtPr* zCS2;%2b9U-ij`}dYfvcYl9GV5WVw{mB`PglepHo2ndvEIKjdZogJ}`|8dpIY@=jL! zWct$1%t;0vObeWNB3ULgn#l|V@#H#eYNR2r2iefD=Hz@sENd;Q$y9oB5t!2M@!&umS?ezU-*&r`mf=2cmh^H0B6EP z*u%U;TkAIFU*0Na3Fledi@4?1s;TzFdvSCNwA4Eds)X{4L8C9khT2ja5#L= zTK$*s8pxXdLvRl)hs&W0Cct8jl`#`!&}(NP#@9c4!Z;)gQnl{@;}=aC5zjQWH66J!j=jsO4v diff --git a/rope.sml b/rope.sml index 6ba6417..bdf3e2b 100644 --- a/rope.sml +++ b/rope.sml @@ -1,20 +1,22 @@ -signature ROPE = sig +signature ROPE = +sig type t - val empty : t - val fromString : string -> t - val size : t -> int - val insert : int * string * t -> t - val delete : int * int * t -> t - val toString : t -> string + val empty: t + val fromString: string -> t + val size: t -> int + val insert: int * string * t -> t + val delete: int * int * t -> t + val toString: t -> string end -structure Rope :> ROPE = struct - datatype t - = N0 of string - | N1 of t - | N2 of t * int * t - | L2 of string * string - | N3 of t * t * t +structure Rope :> ROPE = +struct + datatype t = + N0 of string + | N1 of t + | N2 of t * int * t + | L2 of string * string + | N3 of t * t * t exception AuxConstructor @@ -22,62 +24,45 @@ 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) + N2 (l, _, r) => + 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 "" fun fromString string = N0 string - fun isLessThanTarget(str1, str2) = + fun isLessThanTarget (str1, str2) = String.size str1 + String.size str2 <= targetLength - fun helpSize(acc, rope) = + 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 size rope = helpSize (0, rope) fun insRoot rope = case rope of - 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) + 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) end - | t => - t + | t => t fun delRoot rope = case rope of @@ -86,291 +71,242 @@ structure Rope :> ROPE = struct fun insN1 rope = case rope of - 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) + 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) 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) - | (N3(t1, t2, t3), N1 t4) => + (L2 (s1, s2), t3) => N3 (N0 s1, N0 s2, t3) + | (N3 (t1, t2, t3), N1 t4) => let - val left = N2(t1, size t1, t2) - val right = N2(t3, size t3, t4) + val left = N2 (t1, size t1, t2) + val right = N2 (t3, size t3, t4) in - N2(left, size left, right) + 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) + | (N3 (t1, t2, 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) = + fun delN2Left (left, right) = case (left, right) of - (N1 t1, N1 t2) => - N1(N2(t1, size t1, t2)) - | (N1 (N1 t1), N2(N1 t2, _, (t3 as N2 _))) => + (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) - val inner = N2(left, size left, t3) + val left = N2 (t1, size t1, t2) + val inner = N2 (left, size left, t3) in N1 (inner) end - | (N1 (N1 t1), N2(N2(t2, _, t3), _, N1 t4)) => + | (N1 (N1 t1), N2 (N2 (t2, _, t3), _, N1 t4)) => let - val left = N2(t1, size t1, t2) - val right = N2(t3, size t3, t4) - val inner = N2(left, size left, right) + val left = N2 (t1, size t1, t2) + val right = N2 (t3, size t3, t4) + val inner = N2 (left, size left, right) in N1 inner end - | (N1 (t1 as N1 _), N2((t2 as N2 _), _, (t3 as N2 _))) => + | (N1 (t1 as N1 _), N2 ((t2 as N2 _), _, (t3 as N2 _))) => let - val left = N2(t1, size t1, t2) + val left = N2 (t1, size t1, t2) val right = N1 t3 in - N2(left, size left, right) + 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) - | (N1 t1, N3(t2, t3, t4)) => + (t1, L2 (s1, s2)) => N3 (t1, N0 s1, N0 s2) + | (N1 t1, N3 (t2, t3, t4)) => let - val left = N2(t1, size t1, t2) - val right = N2(t3, size t3, t4) + val left = N2 (t1, size t1, t2) + val right = N2 (t3, size t3, t4) in - N2(left, size left, right) + 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) + | (t1, N3 (t2, t3, t4)) => + 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) = + fun delN2Right (left, right) = case (left, right) of - (N2(N1 t1, _, N2(t2, _, t3)), N1 (N1 t4)) => + (N2 (N1 t1, _, N2 (t2, _, t3)), N1 (N1 t4)) => let - val left = N2(t1, size t1, t2) - val right = N2(t3, size t3, t4) - val inner = N2(left, size left, right) + val left = N2 (t1, size t1, t2) + val right = N2 (t3, size t3, t4) + val inner = N2 (left, size left, right) in N1 inner end - | (N2((t1 as N2 _), lm, N1 t2), N1 (N1 t3)) => + | (N2 ((t1 as N2 _), lm, N1 t2), N1 (N1 t3)) => let - val right = N2(t2, size t2, t3) - val inner = N2(t1, lm, right) + val right = N2 (t2, size t2, t3) + val inner = N2 (t1, lm, right) in N1 inner end - | (N2( (t1 as N2 _), _, (t2 as N2 _)), N1 (t3 as N1 _)) => + | (N2 ((t1 as N2 _), _, (t2 as N2 _)), N1 (t3 as N1 _)) => let val left = N1 t1 - val right = N2(t2, size t2, t3) + val right = N2 (t2, size t2, t3) in - N2(left, size left, right) + 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) + fun insLeaf (curIdx, newStr, rope, oldStr) = + if curIdx <= 0 then + 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) + else + (* Need to split in middle of string. *) + let + val sub1 = String.substring (oldStr, 0, curIdx) + val sub2Len = String.size oldStr - curIdx + val sub2 = String.substring (oldStr, curIdx, sub2Len) + in + if + isLessThanTarget (oldStr, newStr) + then + (N0 (sub1 ^ newStr ^ sub2), NoAction) + else if + curIdx + String.size newStr <= targetLength + then + (L2 (sub1 ^ newStr, sub2), AddedNode) + else if + ((String.size oldStr) - curIdx) + String.size newStr <= targetLength + then + (L2 (sub1, newStr ^ sub2), AddedNode) 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) - else - (* Need to split in middle of string. *) - let - val sub1 = String.substring(oldStr, 0, curIdx) - val sub2Len = String.size oldStr - curIdx - val sub2 = String.substring(oldStr, curIdx, sub2Len) - in - if isLessThanTarget(oldStr, newStr) then - (N0(sub1 ^ newStr ^ sub2), NoAction) - else if curIdx + String.size newStr <= targetLength then - (L2(sub1 ^ newStr, sub2), AddedNode) - 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) - end + (N3 (N0 sub1, N0 newStr, N0 sub2), AddedNode) + end - fun ins(curIdx, newStr, rope) = + fun ins (curIdx, newStr, rope) = case rope of - N2(l, lm, r) => + N2 (l, lm, r) => if curIdx < lm then - let - val (l, action) = ins(curIdx, newStr, l) + let + val (l, action) = ins (curIdx, newStr, l) in (case action of - NoAction => - (case (l, r) of - (N0 s1, N0 s2) => - if isLessThanTarget(s1, s2) then - (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)) + NoAction => + (case (l, r) of + (N0 s1, N0 s2) => + if isLessThanTarget (s1, s2) then + (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)) end else let - val (r, action) = ins(curIdx - lm, newStr, r) + val (r, action) = ins (curIdx - lm, newStr, r) in (case action of - NoAction => - (case (l, r) of - (N0 s1, N0 s2) => - if isLessThanTarget(s1, s2) then - (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)) + NoAction => + (case (l, r) of + (N0 s1, N0 s2) => + if isLessThanTarget (s1, s2) then + (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)) end | N1 t => let - val (t, action) = ins(curIdx, newStr, t) + 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) + 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) = + fun delLeaf (startIdx, endIdx, str) = if startIdx <= 0 andalso endIdx >= String.size str then (empty, false) else if startIdx >= 0 andalso endIdx <= String.size str then let - val sub1 = String.substring(str, 0, startIdx) - val sub2 = String.substring(str, endIdx, (String.size str - endIdx)) + 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 val start = Int.toString startIdx - val str = String.substring(str, 0, startIdx) + val str = String.substring (str, 0, startIdx) in (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) = case rope of - N2(l, lm, r) => + N2 (l, lm, r) => if lm > startIdx andalso lm > endIdx then let - val (l, didAdd) = del(startIdx, endIdx, l) + 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) + 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) + 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 + fun delete (start, length, rope) = + let val (rope, didAdd) = del (start, start + length, rope) + in if didAdd then insRoot rope else delRoot rope end end diff --git a/utils.sml b/utils.sml index 5b629a2..78dd097 100644 --- a/utils.sml +++ b/utils.sml @@ -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