/
Record.purs
95 lines (82 loc) · 2.35 KB
/
Record.purs
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
module Polyform.Input.Interpret.Record where
import Prelude
import Data.Variant (Variant)
import Data.Variant.Internal (VariantRep(VariantRep), unsafeGet)
import Polyform.Input.Interpret.Validation (IntF(..), StringF(..), _int, _string)
import Run (FProxy, Run, VariantF, case_, on)
import Run as Run
import Type.Row (class RowToList, Cons, Nil, kind RowList)
import Prim.Row (class Cons)
import Unsafe.Coerce (unsafeCoerce)
class VariantFieldsType (rl ∷ RowList) (vo ∷ # Type) a | rl a → vo
instance a_variantFieldsTypeSame ∷ (VariantFieldsType rl vo' a, Cons sym Unit vo' vo) ⇒ VariantFieldsType (Cons sym a rl) vo a
else instance b_variantFieldsTypeDiff ∷ (VariantFieldsType rl vo a) ⇒ VariantFieldsType (Cons sym b rl) vo a
else instance c_variantFieldsTypeNil ∷ VariantFieldsType Nil () a
onMatch
∷ ∀ a rl r v
. RowToList r rl
⇒ VariantFieldsType rl v a
⇒ Record r
→ Variant v
→ a
onMatch r v =
case coerceV v of
VariantRep v' → unsafeGet v'.type r
where
coerceV ∷ ∀ b. Variant v → VariantRep b
coerceV = unsafeCoerce
handleInt
∷ forall e n m q ql
. Monoid e
⇒ Monad m
⇒ RowToList q ql
⇒ VariantFieldsType ql n Int
⇒ IntF (Variant n) e (Record q) ~> m
handleInt (IntF n query k) =
pure $ k value
where
value = pure $ onMatch query n
handleString
∷ forall err n m q ql
. Monoid err
⇒ Monad m
⇒ RowToList q ql
⇒ VariantFieldsType ql n String
⇒ StringF (Variant n) err (Record q) ~> m
handleString (StringF n query k) =
pure $ k value
where
value = pure $ onMatch query n
handle
∷ forall ei es n n' m q ql
. Monoid ei
⇒ Monoid es
⇒ Monad m
⇒ RowToList q ql
⇒ VariantFieldsType ql n String
⇒ VariantFieldsType ql n' Int
⇒ VariantF
( string ∷ FProxy (StringF (Variant n) es (Record q))
, int ∷ FProxy (IntF (Variant n') ei (Record q))
)
~> m
handle =
case_
# on _string handleString
# on _int handleInt
-- # on _optString handleOptString
-- # on _optInt handleOptInt
interpret
∷ forall a e n n' m q ql
. Monoid e
⇒ Monad m
⇒ RowToList q ql
⇒ VariantFieldsType ql n String
⇒ VariantFieldsType ql n' Int
⇒ Run
( string ∷ FProxy (StringF (Variant n) e (Record q))
, int ∷ FProxy (IntF (Variant n') e (Record q))
)
a
→ m a
interpret = Run.interpret handle