egison-4.0.0: lib/core/string.egi
--
--
-- String
--
--
string :=
matcher
| regexCg #$regexpr $ $ $ as (string, list string, string) with
| $tgt -> regexCg regexpr tgt
| regex #$regexpr $ $ $ as (string, string, string) with
| $tgt -> regex regexpr tgt
| [] as () with
| $tgt -> if "" = tgt then [()] else []
| $ :: $ as (char, string) with
| $tgt -> if "" = tgt then [] else [unconsString tgt]
| $ ++ #$px :: $ as (string, string) with
| $tgt ->
matchAll S.split (pack [px]) tgt as list string with
| (![] & $xs) ++ ![] & $ys ->
(S.intercalate (pack [px]) xs, S.intercalate (pack [px]) ys)
| $ ++ #$pxs ++ $ as (string, string) with
| $tgt ->
matchAll S.split pxs tgt as list string with
| (![] & $xs) ++ ![] & $ys ->
(S.intercalate pxs xs, S.intercalate pxs ys)
| $ ++ $ as (string, string) with
| $tgt ->
matchAll tgt as string with
| loop $i (1, $n)
($xa_i :: ...)
$rs -> (pack (map (\i -> xa_i) (between 1 n)), rs)
| #$val as () with
| $tgt -> if val = tgt then [()] else []
| $ as (something) with
| $tgt -> [tgt]
--
-- String as collection
--
S.isEmpty xs := xs = ""
S.cons x xs := appendString (pack [x]) xs
S.head xs :=
match xs as string with
| $x :: _ -> x
S.tail xs :=
match xs as string with
| _ :: $r -> r
S.last str :=
match str as string with
| _ ++ $c :: [] -> c
S.map f xs := pack (map f (unpack xs))
S.length xs := lengthString xs
S.split sep ls := splitString sep ls
S.append xs ys := appendString xs ys
S.concat xss := foldr (\xs rs -> S.append xs rs) "" xss
S.intercalate := compose intersperse S.concat
S.replace before after str := S.intercalate after (S.split before str)
--
-- Alphabet
--
C.between c1 c2 := map itoc (between (ctoi c1) (ctoi c2))
C.isBetween c1 c2 c := ctoi c >= ctoi c1 && ctoi c <= ctoi c2
isAlphabet c := C.isBetween 'a' 'z' c || C.isBetween 'A' 'Z' c
isAlphabetString s := all isAlphabet (unpack s)
upperCase c := if C.isBetween 'a' 'z' c then itoc (ctoi c - 32) else c
lowerCase c := if C.isBetween 'A' 'Z' c then itoc (ctoi c + 32) else c