src/share/spin.bend
ezx@1.11.0.0 · 76 lines · 9 definitions
1
2
3
4
5
6
7import Base
8import snap@1.4.0.0/main.bend as R
9import ezx@1.11.0.0/src/share/say.bend as Say
10
11
12def link(+fd: String) -> IO(String):
13 do IO<String>:
14 +out : String <- R.exec(["sh", "-c", Say.probe(), "sh", fd])
15 return String.trim(R.text(out))
16
17
18def dev() -> IO(String):
19 do IO<String>:
20 +err : String <- link("2")
21 +out : String <- link("1")
22 return Say.tty.pick(err, out)
23
24
25def start(on: Bool, +dev: String, +msg: String) -> IO(Say.Spin):
26 match on:
27 case False{}:
28 IO.pure(Say.Spin, Say.Spin{"", "", ""})
29 case True{}:
30 do IO<Say.Spin>:
31 +pid : String <- R.start(["sh", "-c", Say.frames(), "sh", dev, msg])
32 return Say.Spin{dev, String.trim(pid), msg}
33
34def hold.at(plain: Bool, +dev: String, +msg: String) -> IO(Say.Spin):
35 match plain:
36 case True{}:
37 do IO<Say.Spin>:
38 IO.print_err(msg)
39 return Say.Spin{"", "", ""}
40 case False{}:
41 start(True{}, dev, msg)
42
43
44
45def hold(+msg: String) -> IO(Say.Spin):
46 do IO<Say.Spin>:
47 +tty : String <- dev()
48 hold.at(String.is_empty(tty), tty, msg)
49
50
51
52def owed(empty: Bool, +msg: String) -> IO(Unit):
53 match empty:
54 case True{}:
55 IO.pure(Unit, Unit{})
56 case False{}:
57 IO.print_err(msg)
58
59
60def done.live(+dev: String, +pid: String, +msg: String) -> IO(Unit):
61 do IO<Unit>:
62 _k : String <- R.exec(["kill", pid])
63 _s : String <- R.exec(["sh", "-c", Say.settle(), "sh", dev, msg])
64 return Unit{}
65
66def done.bad(bad: Bool, +dev: String, +pid: String, +msg: String) -> IO(Unit):
67 match bad:
68 case True{}:
69 owed(String.is_empty(msg), msg)
70 case False{}:
71 done.live(dev, pid, msg)
72
73
74def done(spin: Say.Spin) -> IO(Unit):
75 Say.Spin{+term, +pid, +msg} = spin
76 done.bad(Bool.or(String.is_empty(pid), String.eq(pid, "0")), term, pid, msg)