Skip to content

Commit 4e456da

Browse files
committed
Updates based on feedback from @natefaubion
1 parent 140c3bc commit 4e456da

File tree

3 files changed

+77
-43
lines changed

3 files changed

+77
-43
lines changed

src/React.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,3 @@ function createContext(defaultValue) {
169169
};
170170
}
171171
exports.createContext = createContext;
172-
173-
exports.createElementHook = function createElementHook(fn) {
174-
return function(props) {
175-
return React.createElement(fn, props);
176-
};
177-
};

src/React.purs

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ module React
6363
, ContextProvider
6464
, ContextConsumer
6565
, createContext
66-
, createElementHook
66+
, createHookElement
67+
, unsafeCreateHookElement
68+
, createHookElementDynamic
69+
, unsafeCreateHookElementDynamic
70+
, createHookLeafElement
71+
, unsafeCreateHookLeafElement
6772
) where
6873

6974
import Prelude
@@ -467,9 +472,58 @@ type ContextConsumer a = ReactClass { children :: a -> ReactElement }
467472
-- | Create a new context provider/consumer pair given a default value.
468473
foreign import createContext :: forall a. a -> Context a
469474

470-
-- | Create an element from a function using Hook.
471-
foreign import createElementHook
475+
-- | Create an element from a function using Hooks spreading the children array. Used when the children are known up front.
476+
createHookElement
477+
:: forall required given
478+
. ReactPropFields required given
479+
=> ({ children :: Children | required } -> Hook ReactElement)
480+
-> { | given }
481+
-> Array ReactElement
482+
-> ReactElement
483+
createHookElement k = createElementImpl (unsafeCoerce k)
484+
485+
-- | An unsafe version of `createHookElement` which does not enforce the reserved properties "key" and "ref".
486+
unsafeCreateHookElement
487+
:: forall props
488+
. ({ children :: Children | props } -> Hook ReactElement)
489+
-> { | props }
490+
-> Array ReactElement
491+
-> ReactElement
492+
unsafeCreateHookElement k = createElementImpl (unsafeCoerce k)
493+
494+
-- | Create an element from a function using Hooks passing the children array. Used for a dynamic array of children.
495+
createHookElementDynamic
496+
:: forall required given
497+
. ReactPropFields required given
498+
=> ({ children :: Children | required } -> Hook ReactElement)
499+
-> { | given }
500+
-> Array ReactElement
501+
-> ReactElement
502+
createHookElementDynamic k = createElementDynamicImpl (unsafeCoerce k)
503+
504+
-- | An unsafe version of `createHookElementDynamic` which does not enforce the reserved properties "key" and "ref".
505+
unsafeCreateHookElementDynamic
472506
:: forall props
473-
. ({ | props } -> Hook ReactElement)
507+
. ({ children :: Children | props } -> Hook ReactElement)
474508
-> { | props }
509+
-> Array ReactElement
510+
-> ReactElement
511+
unsafeCreateHookElementDynamic k = createElementDynamicImpl (unsafeCoerce k)
512+
513+
-- | Create an element from a function using Hooks that does not require children.
514+
createHookLeafElement
515+
:: forall required given
516+
. ReactPropFields required given
517+
=> ({ | given } -> Hook ReactElement)
518+
-> { | given }
519+
-> ReactElement
520+
createHookLeafElement k = createLeafElementImpl (unsafeCoerce k)
521+
522+
-- | An unsafe version of `createHookLeafElement` which does not enforce the reserved
523+
-- | properties "key" and "ref".
524+
unsafeCreateHookLeafElement
525+
:: forall props
526+
. (props -> Hook ReactElement)
527+
-> props
475528
-> ReactElement
529+
unsafeCreateHookLeafElement k = createLeafElementImpl (unsafeCoerce k)

src/React/Hook.purs

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module React.Hook
22
( Hook
3+
, HookInput
4+
, hookInput
35

46
, useState
57
, useStateLazy
@@ -8,8 +10,6 @@ module React.Hook
810
, SetState
911

1012
, useEffect
11-
, effectInput
12-
, EffectInput
1313

1414
, useContext
1515
, Context
@@ -20,12 +20,8 @@ module React.Hook
2020
, Dispatch
2121

2222
, useCallback
23-
, callbackInput
24-
, CallbackInput
2523

2624
, useMemo
27-
, memoInput
28-
, MemoInput
2925

3026
, useRef
3127
, getRef
@@ -101,19 +97,14 @@ foreign import useState_
10197
useEffect
10298
:: forall a
10399
. Effect (Effect a)
104-
-> Maybe (Array EffectInput)
100+
-> Maybe (Array HookInput)
105101
-> Hook Unit
106102
useEffect k = runFn2 useEffect_ k <<< Nullable.toNullable
107103

108-
effectInput :: forall a. a -> EffectInput
109-
effectInput = unsafeCoerce
110-
111-
foreign import data EffectInput :: Type
112-
113104
foreign import useEffect_
114105
:: forall a
115106
. Fn2 (Effect (Effect a))
116-
(Nullable (Array EffectInput))
107+
(Nullable (Array HookInput))
117108
(Hook Unit)
118109

119110
useContext :: forall a. Context a -> Hook a
@@ -171,37 +162,27 @@ foreign import useReducerLazy_
171162
useCallback
172163
:: forall a b
173164
. (a -> b)
174-
-> Maybe (Array CallbackInput)
165+
-> Maybe (Array HookInput)
175166
-> Hook (a -> b)
176167
useCallback k = runFn2 useCallback_ k <<< Nullable.toNullable
177168

178-
callbackInput :: forall a. a -> CallbackInput
179-
callbackInput = unsafeCoerce
180-
181-
foreign import data CallbackInput :: Type
182-
183169
foreign import useCallback_
184170
:: forall a b
185171
. Fn2 (a -> b)
186-
(Nullable (Array CallbackInput))
172+
(Nullable (Array HookInput))
187173
(Hook (a -> b))
188174

189175
useMemo
190176
:: forall a b
191177
. (Unit -> a -> b)
192-
-> Maybe (Array MemoInput)
178+
-> Maybe (Array HookInput)
193179
-> Hook (a -> b)
194180
useMemo k = runFn2 useMemo_ k <<< Nullable.toNullable
195181

196-
memoInput :: forall a. a -> MemoInput
197-
memoInput = unsafeCoerce
198-
199-
foreign import data MemoInput :: Type
200-
201182
foreign import useMemo_
202183
:: forall a b
203184
. Fn2 (Unit -> a -> b)
204-
(Nullable (Array MemoInput))
185+
(Nullable (Array HookInput))
205186
(Hook (a -> b))
206187

207188
useRef :: forall a. Maybe a -> Hook (Ref a)
@@ -289,12 +270,6 @@ foreign import useLayoutEffect_
289270

290271
foreign import data Hook :: Type -> Type
291272

292-
unHook :: forall a. Hook a -> a
293-
unHook = unsafeCoerce
294-
295-
hook :: forall a. a -> Hook a
296-
hook = unsafeCoerce
297-
298273
instance functorHook :: Functor Hook where
299274
map k = hook <<< k <<< unHook
300275

@@ -308,3 +283,14 @@ instance bindHook :: Bind Hook where
308283
bind fa k = k (unHook fa)
309284

310285
instance monadHook :: Monad Hook
286+
287+
unHook :: forall a. Hook a -> a
288+
unHook = unsafeCoerce
289+
290+
hook :: forall a. a -> Hook a
291+
hook = unsafeCoerce
292+
293+
foreign import data HookInput :: Type
294+
295+
hookInput :: forall a. a -> HookInput
296+
hookInput = unsafeCoerce

0 commit comments

Comments
 (0)