packages feed

egison-3.3.11: lib/string/string.egi

;;;;;
;;;;;
;;;;; String
;;;;;
;;;;;

(define $string
  (matcher
    {[,$val []
      {[$tgt  (if (eq? val tgt)
                {[]}
                {})]}]
     [<nil> []
      {[$tgt (if (eq? "" tgt)
               {[]}
               {})]}]
     [<cons $ $> [char string]
      {[$tgt (if (eq? "" tgt)
               {}
               {(unsnoc-string tgt)})]}]
     [<join $ <cons ,$px $>> [string string]
      {[$tgt (match-all (split (pack {px}) tgt) (list string)
               [<join $xs $ys> [(S.append (car xs) (S.concat (map (S.append (pack {px}) $) (cdr xs))))
                                (S.append (car ys) (S.concat (map (S.append (pack {px}) $) (cdr ys))))
                                ]])]}]
     [<join $ <join ,$pxs $>> [string string]
      {[$tgt (match-all (split-string tgt) (list string)
               [<join $xs $ys> [(S.append (car xs) (S.concat (map (S.append px $) (cdr xs))))
                                (S.append (car ys) (S.concat (map (S.append px $) (cdr ys))))
                                ]])]}]
     [$ [something]
      {[$tgt {tgt}]}]
     }))

(define $chop
  (lambda [$xs]
    (match xs string
      {[<snoc (| ,'\n' ,' ') $ys> (chop ys)]
       [_ xs]})))

;;;
;;; String as Collection
;;;

(define $S.length
  (lambda [$xs]
    (length-string xs)))

(define $S.split
  (lambda [$in $ls]
    (split-string in ls)))

(define $S.append
  (lambda [$xs $ys]
    (append-string xs ys)))

(define $S.concat
  (lambda [$xss]
    (foldr (lambda [$xs $rs] (S.append xs rs))
           ""
           xss)))

(define $S.intercalate (compose intersperse S.concat))