-
Notifications
You must be signed in to change notification settings - Fork 0
/
DataUiInterface.purs
137 lines (110 loc) · 3.42 KB
/
DataUiInterface.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
module DataMVC.Record.DataUiInterface
( FnRecordGet
, class DataUiInterfaceRecord
, dataUiInterfaceRecord
, class MapProp
, mapProp
) where
import Prelude
import Data.Maybe (Maybe)
import Data.Newtype (class Newtype)
import Data.Newtype as NT
import Data.Symbol (class IsSymbol)
import Heterogeneous.Mapping (class HMap, class Mapping, hmap)
import DataMVC.Record.Extract (class ExtractRecord, extractRecord)
import DataMVC.Record.Init (class InitRecord, initRecord)
import DataMVC.Types.DataUI (DataUiInterface(..))
import DataMVC.Types.DataError (DataResult)
import MVC.Record (class UpdateRecord, class ViewRecord, RecordMsg, RecordState, updateRecord, viewRecord)
import MVC.Record.UI (UIRecordProps)
import Prim.Row as Row
import Record as Record
import Type.Proxy (Proxy(..))
class
DataUiInterfaceRecord
(uis :: Row Type)
(srf :: Type -> Type)
(rmsg :: Row Type)
(rsta :: Row Type)
(r :: Row Type)
where
dataUiInterfaceRecord
:: UIRecordProps srf (RecordMsg rmsg) (RecordState rsta)
-> Record uis
-> DataUiInterface srf (RecordMsg rmsg) (RecordState rsta) (Record r)
instance
( MapProp "extract" uis extracts
, MapProp "init" uis inits
, MapProp "update" uis updates
, MapProp "view" uis views
, InitRecord inits r rsta
, UpdateRecord updates rmsg rsta
, ViewRecord srf views rmsg rsta
, ExtractRecord extracts rsta r
) =>
DataUiInterfaceRecord uis srf rmsg rsta r
where
dataUiInterfaceRecord
:: UIRecordProps srf (RecordMsg rmsg) (RecordState rsta)
-> Record uis
-> DataUiInterface srf (RecordMsg rmsg) (RecordState rsta) (Record r)
dataUiInterfaceRecord props uis = DataUiInterface { init, update, view, extract, name }
where
-- Fields
init :: Maybe (Record r) -> RecordState rsta
init = initRecord inits
update :: RecordMsg rmsg -> RecordState rsta -> RecordState rsta
update = updateRecord updates
view :: RecordState rsta -> srf (RecordMsg rmsg)
view = viewRecord views { viewEntries: props.viewEntries }
extract :: RecordState rsta -> DataResult (Record r)
extract = extractRecord extracts
name :: String
name = "Record"
-- Records
inits :: Record inits
inits = mapProp prxInit uis
updates :: Record updates
updates = mapProp prxUpdate uis
views :: Record views
views = mapProp prxView uis
extracts :: Record extracts
extracts = mapProp prxExtract uis
-- Proxies
prxInit :: Proxy "init"
prxInit = Proxy
prxUpdate :: Proxy "update"
prxUpdate = Proxy
prxView :: Proxy "view"
prxView = Proxy
prxExtract :: Proxy "extract"
prxExtract = Proxy
-------------------------------------------------------------------------------
--- MapProp
-------------------------------------------------------------------------------
class
MapProp
(sym :: Symbol)
(ri :: Row Type)
(ro :: Row Type)
| sym ri -> ro where
mapProp :: Proxy sym -> { | ri } -> { | ro }
instance
( HMap (FnRecordGet sym) (Record ri) (Record ro)
) =>
MapProp sym ri ro
where
mapProp :: Proxy sym -> Record ri -> Record ro
mapProp sym = hmap (FnRecordGet sym)
data FnRecordGet :: Symbol -> Type
data FnRecordGet sym = FnRecordGet (Proxy sym)
instance
( Row.Cons sym a rx r
, IsSymbol sym
, Newtype nt (Record r)
) =>
Mapping (FnRecordGet sym) nt a
where
mapping :: FnRecordGet sym -> nt -> a
mapping (FnRecordGet prxSym) =
Record.get prxSym <<< NT.unwrap