src/lsp/checker/answer.bend
bolt@1.27.0.0 · 67 lines · 8 definitions
1
2
3import Base
4import bolt@1.27.0.0/src/lsp/report.bend as Rep
5
6
7
8type Answer is Data:
9 Checked{ds: List<&2, Rep.Diag>}
10 Unrun{}
11
12
13def errors(aa: Answer) -> List<&2, Rep.Diag>:
14 match aa:
15 case Checked{ds}:
16 ds
17 case Unrun{}:
18 []
19
20
21
22def died(ds: List<&2, Rep.Diag>) -> Answer:
23 match ds:
24 case Nil{}:
25 Unrun{}
26 case Con{dd, rest}:
27 Checked{dd <> rest}
28
29
30
31
32def answer.tag(ran: Bool, killed: Bool, names: Maybe<&2, List<&2, String>>, text: String) -> Answer:
33 match ran killed:
34 case True{} _k:
35 Checked{Rep.parse_in(names, text)}
36 case False{} True{}:
37 died(Rep.parse_in(names, text))
38 case False{} False{}:
39 Unrun{}
40
41
42
43def answer(names: Maybe<&2, List<&2, String>>, ss: String) -> Answer:
44 match ss:
45 case SNil{}:
46 Unrun{}
47 case SCon{+cc, text}:
48 answer.tag(Char.is_eq(cc, 'r'), Char.is_eq(cc, 's'), names, text)
49
50
51
52def proved(aa: Answer, ds: List<&2, Rep.Diag>) -> Answer:
53 match aa:
54 case Checked{pds}:
55 Checked{Bool.pick(List<&2, Rep.Diag>, List.is_empty(&2, Rep.Diag, pds), [], ds)}
56 case Unrun{}:
57 Unrun{}
58
59
60
61type Checker is Type:
62 Checker{run: String -> IO(Answer)}
63
64
65def check(cc: Checker, path: String) -> IO(Answer):
66 Checker{r} = cc
67 r(path)