aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/test/test/luxc/lang/analysis/common.lux
blob: 086a0bd314c04832fbf2b909ed6473bd9ca15303 (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
47
48
49
50
51
52
(;module:
  lux
  (lux (control pipe)
       ["r" math/random "r/" Monad<Random>]
       (data ["e" error])
       [meta]
       (meta [code]))
  (luxc ["&" lang]
        (lang (analysis [";A" expression])
              [eval]))
  (test/luxc common))

(def: gen-unit
  (r;Random Code)
  (r/wrap (' [])))

(def: #export gen-primitive
  (r;Random [Type Code])
  (with-expansions
    [<generators> (do-template [<type> <code-wrapper> <value-gen>]
                    [(r;seq (r/wrap <type>) (r/map <code-wrapper> <value-gen>))]

                    [Unit code;tuple (r;list +0 gen-unit)]
                    [Bool code;bool  r;bool]
                    [Nat  code;nat   r;nat]
                    [Int  code;int   r;int]
                    [Deg  code;deg   r;deg]
                    [Frac code;frac  r;frac]
                    [Text code;text  (r;text +5)]
                    )]
    ($_ r;either
        <generators>
        )))

(def: #export analyse
  &;Analyser
  (expressionA;analyser eval;eval))

(do-template [<name> <on-success> <on-failure>]
  [(def: #export (<name> analysis)
     (All [a] (-> (Meta a) Bool))
     (|> analysis
         (meta;run (init-compiler []))
         (case> (#e;Success _)
                <on-success>

                (#e;Error error)
                <on-failure>)))]

  [check-success true false]
  [check-failure false true]
  )