Skip to content

Commit 246633a

Browse files
committed
Add merge function
1 parent d730d58 commit 246633a

File tree

4 files changed

+90
-12
lines changed

4 files changed

+90
-12
lines changed

Diff for: bower.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
"purescript-functions": "^3.0.0",
1111
"purescript-eff": "^3.1.0",
1212
"purescript-unsafe-coerce": "^3.0.0",
13-
"purescript-nullable": "^3.0.0"
13+
"purescript-nullable": "^3.0.0",
14+
"purescript-typelevel-prelude": "^2.6.0",
15+
"purescript-record": "^0.2.6"
1416
}
1517
}

Diff for: examples/controlled-input/src/ControlledInput.purs

+13-7
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,28 @@ module ControlledInput where
22

33
import Prelude
44

5-
import Data.Maybe (fromMaybe)
5+
import Data.Maybe (Maybe(..), fromMaybe, maybe)
66
import Data.Nullable (toMaybe)
77
import React.Basic (ReactComponent, react)
88
import React.Basic.DOM as R
9-
import React.Basic.DOM.Events (handler, targetValue)
9+
import React.Basic.DOM.Events (targetValue, timeStamp)
10+
import React.Basic.DOM.Events as Events
1011

1112
component :: ReactComponent {}
1213
component = react
1314
{ displayName: "Counter"
14-
, initialState: { value: "hello world" }
15+
, initialState: { value: "hello world", timeStamp: Nothing }
1516
, receiveProps: \_ _ _ -> pure unit
1617
, render: \_ state setState ->
1718
R.div_
18-
[ R.input { onChange: handler targetValue \value ->
19-
setState \_ -> { value: fromMaybe "" (toMaybe value) }
20-
, value: state.value
21-
}
19+
[ R.p_ [ R.input { onChange: Events.handler (Events.preventDefault >>> Events.merge { targetValue, timeStamp }) \{ timeStamp, targetValue } ->
20+
setState \_ -> { value: fromMaybe "" (toMaybe targetValue)
21+
, timeStamp: Just timeStamp
22+
}
23+
, value: state.value
24+
}
25+
]
26+
, R.p_ [ R.text ("Current value = " <> show state.value) ]
27+
, R.p_ (maybe [] (\ts -> [R.text ("Changed at: " <> show ts)]) state.timeStamp)
2228
]
2329
}

Diff for: generated-docs/React/Basic/DOM/Events.md

+38
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ newtype EventFn a b
4545
``` purescript
4646
Semigroupoid EventFn
4747
Category EventFn
48+
(IsSymbol l, RowCons l (EventFn a b) fns_rest fns, RowCons l b r_rest r, RowLacks l fns_rest, RowLacks l r_rest, Merge rest fns_rest a r_rest) => Merge (Cons l (EventFn a b) rest) fns a r
49+
```
50+
51+
#### `handler`
52+
53+
``` purescript
54+
handler :: forall a. EventFn SyntheticEvent a -> (a -> Eff (react :: ReactFX) Unit) -> EventHandler
55+
```
56+
57+
#### `merge`
58+
59+
``` purescript
60+
merge :: forall a fns fns_list r. RowToList fns fns_list => Merge fns_list fns a r => { | fns } -> EventFn a ({ | r })
4861
```
4962

5063
#### `bubbles`
@@ -143,6 +156,18 @@ isPropagationStopped :: EventFn SyntheticEvent Boolean
143156
target :: EventFn SyntheticEvent DOMNode
144157
```
145158

159+
#### `targetChecked`
160+
161+
``` purescript
162+
targetChecked :: EventFn SyntheticEvent (Nullable Boolean)
163+
```
164+
165+
#### `targetValue`
166+
167+
``` purescript
168+
targetValue :: EventFn SyntheticEvent (Nullable String)
169+
```
170+
146171
#### `timeStamp`
147172

148173
``` purescript
@@ -155,4 +180,17 @@ timeStamp :: EventFn SyntheticEvent Number
155180
type_ :: EventFn SyntheticEvent String
156181
```
157182

183+
#### `Merge`
184+
185+
``` purescript
186+
class Merge (rl :: RowList) fns a r | rl -> fns, rl a -> r where
187+
mergeImpl :: RLProxy rl -> { | fns } -> EventFn a ({ | r })
188+
```
189+
190+
##### Instances
191+
``` purescript
192+
Merge Nil () a ()
193+
(IsSymbol l, RowCons l (EventFn a b) fns_rest fns, RowCons l b r_rest r, RowLacks l fns_rest, RowLacks l r_rest, Merge rest fns_rest a r_rest) => Merge (Cons l (EventFn a b) rest) fns a r
194+
```
195+
158196

Diff for: src/React/Basic/DOM/Events.purs

+36-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module React.Basic.DOM.Events
77
, DOMEvent
88
, EventFn
99
, handler
10-
-- , smoosh
10+
, merge
1111
, bubbles
1212
, cancelable
1313
, currentTarget
@@ -28,14 +28,19 @@ module React.Basic.DOM.Events
2828
, targetValue
2929
, timeStamp
3030
, type_
31+
, class Merge
32+
, mergeImpl
3133
) where
3234

3335
import Prelude
3436

3537
import Control.Monad.Eff (Eff)
3638
import Control.Monad.Eff.Uncurried (EffFn1, mkEffFn1)
3739
import Data.Nullable (Nullable)
40+
import Data.Record (delete, get, insert)
41+
import Data.Symbol (class IsSymbol, SProxy(SProxy))
3842
import React.Basic (ReactFX)
43+
import Type.Row (kind RowList, class RowToList, class RowLacks, RLProxy(..), Cons, Nil)
3944
import Unsafe.Coerce (unsafeCoerce)
4045

4146
-- | An event handler, which receives a `SyntheticEvent` and performs some
@@ -59,9 +64,36 @@ derive newtype instance categoryBuilder :: Category EventFn
5964
handler :: forall a. EventFn SyntheticEvent a -> (a -> Eff (react :: ReactFX) Unit) -> EventHandler
6065
handler (EventFn fn) cb = mkEffFn1 $ fn >>> cb
6166

62-
-- smoosh
63-
-- :: { b :: EventFn a b } -> { c :: EventFn a c } -> EventFn a { b :: b, c :: c }
64-
-- smoosh = ?smoosh
67+
class Merge (rl :: RowList) fns a r | rl -> fns, rl a -> r where
68+
mergeImpl :: RLProxy rl -> Record fns -> EventFn a (Record r)
69+
70+
instance mergeNil :: Merge Nil () a () where
71+
mergeImpl _ _ = EventFn \_ -> {}
72+
73+
instance mergeCons
74+
:: ( IsSymbol l
75+
, RowCons l (EventFn a b) fns_rest fns
76+
, RowCons l b r_rest r
77+
, RowLacks l fns_rest
78+
, RowLacks l r_rest
79+
, Merge rest fns_rest a r_rest
80+
)
81+
=> Merge (Cons l (EventFn a b) rest) fns a r
82+
where
83+
mergeImpl _ fns = EventFn \a ->
84+
let EventFn inner = mergeImpl (RLProxy :: RLProxy rest) (delete l fns)
85+
EventFn f = get l fns
86+
in insert l (f a) (inner a)
87+
where
88+
l = SProxy :: SProxy l
89+
90+
merge
91+
:: forall a fns fns_list r
92+
. RowToList fns fns_list
93+
=> Merge fns_list fns a r
94+
=> Record fns
95+
-> EventFn a (Record r)
96+
merge = mergeImpl (RLProxy :: RLProxy fns_list)
6597

6698
bubbles :: EventFn SyntheticEvent Boolean
6799
bubbles = EventFn \e -> (unsafeCoerce e).bubbles

0 commit comments

Comments
 (0)