diff --git a/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/stdlib.satyh b/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/stdlib.satyh index ad70c1eb2..ed03a0df0 100644 --- a/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/stdlib.satyh +++ b/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/stdlib.satyh @@ -70,6 +70,9 @@ module Stdlib :> sig val persistent ~split-into-grapheme-clusters : string -> list string val persistent ~empty : string val persistent ~split-into-lines : string -> list (int * string) + val persistent ~concat : string -> list string -> string + val persistent ~chop-prefix : string -> string -> option string + val persistent ~chop-suffix : string -> string -> option string end module Ordering : sig type t = ordering diff --git a/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/string.satyg b/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/string.satyg index 7487747a8..04d227c0a 100644 --- a/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/string.satyg +++ b/lib-satysfi/packages/stdlib/stdlib.0.0.1/src/string.satyg @@ -19,6 +19,9 @@ module String :> sig val persistent ~split-into-grapheme-clusters : string -> list string val persistent ~empty : string val persistent ~split-into-lines : string -> list (int * string) + val persistent ~concat : string -> list string -> string + val persistent ~chop-prefix : string -> string -> option string + val persistent ~chop-suffix : string -> string -> option string end = struct type t = string @@ -55,4 +58,33 @@ end = struct val persistent ~split-into-lines = split-into-lines %PRIMITIVE + val persistent ~concat sep elems = + elems |> List.fold-adjacent (fun s elem _ next-opt -> + match next-opt with + | None -> s ^ elem + | Some(_) -> s ^ elem ^ sep + end + ) ` ` + + val persistent ~rec chop-aux chars-prefix chars-target = + match (chars-prefix, chars-target) with + | ([], _) -> + Some(chars-target) + | (prefix-head :: prefix-tail, target-head :: target-tail) -> + if prefix-head == target-head then + chop-aux prefix-tail target-tail + else + None + | (_, []) -> + None + end + + val persistent ~chop-prefix prefix target = + Option.map from-scalar-values (chop-aux (to-scalar-values prefix) (to-scalar-values target)) + + val persistent ~chop-suffix suffix target = + let decompose s = List.reverse (to-scalar-values s) in + let compose chars = from-scalar-values (List.reverse chars) in + Option.map compose (chop-aux (decompose suffix) (decompose target)) + end