frame.bend
cswap-bend-cli@0.1.0.0 · 53 lines · 7 definitions
1import Base
2
3
4
5
6
7type Cut is Data:
8 Cut{msg: String, rest: String}
9
10def nl.pick(hit: Bool, n: Nat, rest: Maybe<&2, Nat>) -> Maybe<&2, Nat>:
11 match hit:
12 case True{}:
13 Some{n}
14 case False{}:
15 rest
16
17
18def nl.find(s: String, +n: Nat) -> Maybe<&2, Nat>:
19 match s:
20 case SNil{}:
21 None{}
22 case SCon{Chr{+c}, t}:
23 nl.pick(U32.is_eq(c, 10), n, nl.find(t, Nat.add(n, 1n)))
24
25
26
27
28def blank.find(s: String, +n: Nat, +prev: Bool) -> Maybe<&2, Nat>:
29 match s:
30 case SNil{}:
31 None{}
32 case SCon{Chr{+c}, t}:
33 nl.pick(prev && U32.is_eq(c, 10), n, blank.find(t, Nat.add(n, 1n), Bool.pick(Bool, U32.is_eq(c, 13), prev, U32.is_eq(c, 10))))
34
35def cut.at(m: Maybe<&2, Nat>, +s: String) -> Maybe<&2, Cut>:
36 match m:
37 case None{}:
38 None{}
39 case Some{+n}:
40 Some{Cut{String.take(s, n), String.drop(s, Nat.add(n, 1n))}}
41
42
43
44def take(block: Bool, +buf: String) -> Maybe<&2, Cut>:
45 match block:
46 case True{}:
47 cut.at(blank.find(buf, 0n, True{}), buf)
48 case False{}:
49 cut.at(nl.find(buf, 0n), buf)
50
51
52def blank(+s: String) -> Bool:
53 String.is_empty(String.trim(s))