summaryrefslogtreecommitdiff
path: root/lib/string.fnl
blob: 653882778279562f19cfc4ce8cd93df36342bf5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
(local {: must} (require :lib.utils))

(fn empty? [str]
  (or (= str nil) (= (# str) 0)))

(fn letters [str]
  (assert
    (= "string" (type str))
    (string.format "letters(): str must be string, %s given" (type str)))
  (var result [])
  (for [i 1 (must (luna.utf8.len str))]
    (table.insert result (must (luna.utf8.sub str i 1))))
  result)

(fn split [str delimiter]
  (if (empty? str)
    []
    (do
      (local result {})
      (local len (# str))
      (var cursor 1)
      (var (start end) (str:find delimiter))
      (while start
        (when (< cursor start)
          (table.insert result (str:sub cursor (- start 1))))
        (set cursor (+ end 1))
        (set (start end) (str:find delimiter cursor)))
      (when (<= cursor len)
        (table.insert result (str:sub cursor len)))
      result)))

(fn ends-with [str end]
  (= (string.sub str (- (# end))) end))

(fn trim [str]
  (str:match "^%s*(.-)%s*$"))

(fn truncate [str len ellipsis]
  (if (and (= (type str) "string")
           (< 0 (# str)))
    (if (< (must (luna.utf8.len str)) len)
      str
      (.. (trim (must (luna.utf8.sub str 1 len))) (or ellipsis "...")))
    ""))

{: letters : empty? : split : ends-with : trim : truncate}