/
Defaults.purs
83 lines (71 loc) · 2.9 KB
/
Defaults.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
module Lumi.Components.Form.Defaults
( class FormDefaults
, formDefaults
, class FormDefaultsRecord
, formDefaultsRecordBuilder
) where
import Prelude
import Data.Array.NonEmpty (NonEmptyArray)
import Data.Either (Either(..))
import Data.Map (Map)
import Data.Map as Map
import Data.Set (Set)
import Data.Set as Set
import Data.Maybe (Maybe(..))
import Data.Symbol (class IsSymbol, SProxy(..))
import Lumi.Components.Form.Validation (Validated(..))
import Prim.Row (class Cons, class Lacks)
import Prim.RowList (class RowToList, Cons, Nil)
import Record.Builder (Builder)
import Record.Builder as Builder
import Type.Data.RowList (RLProxy(..))
-- | Provides default values for primitive data types to be used as initial
-- | values in form builders.
-- |
-- | For example:
-- |
-- | ```purescript
-- | build_ formDefaults ado
-- | firstName <- focus_ (prop (SProxy :: SProxy "firstName")) textbox
-- | lastName <- focus_ (prop (SProxy :: SProxy "lastName")) textbox
-- | in { firstName, lastName }
-- | ```
class FormDefaults a where
formDefaults :: a
instance formDefaultsUnit :: FormDefaults Unit where formDefaults = unit
instance formDefaultsBoolean :: FormDefaults Boolean where formDefaults = false
instance formDefaultsNumber :: FormDefaults Number where formDefaults = 0.0
instance formDefaultsInt :: FormDefaults Int where formDefaults = 0
instance formDefaultsString :: FormDefaults String where formDefaults = ""
instance formDefaultsArray :: FormDefaults (Array a) where formDefaults = []
instance formDefaultsSet :: FormDefaults (Set a) where formDefaults = Set.empty
instance formDefaultsMap :: FormDefaults (Map k a) where formDefaults = Map.empty
instance formDefaultsNonEmptyArray :: FormDefaults a => FormDefaults (NonEmptyArray a) where
formDefaults = pure formDefaults
instance formDefaultsMaybe :: FormDefaults (Maybe a) where
formDefaults = Nothing
instance formDefaultsEither :: FormDefaults a => FormDefaults (Either a b) where
formDefaults = Left formDefaults
instance formDefaultsValidated :: FormDefaults a => FormDefaults (Validated a) where
formDefaults = Fresh formDefaults
instance formDefaultsRecord ::
( RowToList r rl
, FormDefaultsRecord rl () r
) => FormDefaults (Record r) where
formDefaults = Builder.build (formDefaultsRecordBuilder (RLProxy :: RLProxy rl)) {}
--
class FormDefaultsRecord rl r_ r | rl -> r_ r where
formDefaultsRecordBuilder :: RLProxy rl -> Builder { | r_ } { | r }
instance formDefaultsRecordNil :: FormDefaultsRecord Nil () () where
formDefaultsRecordBuilder _ = identity
instance formDefaultsRecordCons ::
( IsSymbol l
, FormDefaults a
, FormDefaultsRecord tail r_ tailR
, Lacks l tailR
, Cons l a tailR r
) => FormDefaultsRecord (Cons l a tail) r_ r where
formDefaultsRecordBuilder _ = head <<< tail
where
head = Builder.insert (SProxy :: SProxy l) (formDefaults :: a)
tail = formDefaultsRecordBuilder (RLProxy :: RLProxy tail)