Commit 87165299 authored by Justin Woo's avatar Justin Woo

concretely type delay into Effect in Hooks

parent 9d26c0fa
module Reactix
( module Reactix.React
, module Reactix.Hooks
, module Reactix.SyntheticEvent
( module Exports
) where
import Reactix.React
import Reactix.Hooks
import Reactix.SyntheticEvent (SyntheticEvent)
import Reactix.React (class IsComponent, Component, Consumer, Context, Element, Hooks, Memo, Provider, React, ReactDOM, Ref, consume, consumeContext, consumer, createContext, createDOMElement, createElement, createPortal, createRef, fragment, hooksComponent, isValid, memo, memo', provide, provideContext, provider, react, reactDOM, readNullableRef, readRef, render, runHooks, setRef, staticComponent, unsafeHooksEffect) as Exports
import Reactix.Hooks (Reducer, State, nothing, thenNothing, unsafeUseCallback, unsafeUseEffect, unsafeUseImperativeHandle, unsafeUseLayoutEffect, unsafeUseMemo, useCallback, useCallback1, useCallback2, useCallback3, useCallback4, useCallback5, useContext, useDebugValue, useDebugValue', useEffect, useEffect', useEffect1, useEffect1', useEffect2, useEffect2', useEffect3, useEffect3', useEffect4, useEffect4', useEffect5, useEffect5', useEffectFn1, useEffectFn1', useEffectFn2, useEffectFn2', useEffectFn3, useEffectFn3', useEffectFn4, useEffectFn4', useEffectFn5, useEffectFn5', useEffectOnce, useEffectOnce', useImperativeHandle, useImperativeHandle1, useImperativeHandle2, useImperativeHandle3, useImperativeHandle4, useImperativeHandle5, useLayoutEffect, useLayoutEffect', useLayoutEffect1, useLayoutEffect1', useLayoutEffect2, useLayoutEffect2', useLayoutEffect3, useLayoutEffect3', useLayoutEffect4, useLayoutEffect4', useLayoutEffect5, useLayoutEffect5', useLayoutEffectFn1, useLayoutEffectFn1', useLayoutEffectFn2, useLayoutEffectFn2', useLayoutEffectFn3, useLayoutEffectFn3', useLayoutEffectFn4, useLayoutEffectFn4', useLayoutEffectFn5, useLayoutEffectFn5', useMemo, useMemo1, useMemo2, useMemo3, useMemo4, useMemo5, useReducer, useReducer', useRef, useState, useState') as Exports
import Reactix.SyntheticEvent (SyntheticEvent) as Exports
......@@ -42,6 +42,10 @@ import Reactix.React (Context, Hooks, Ref, react)
--- useState
-- delay concretely typed to Effect
delayEffect :: forall a b. a -> (a -> Effect b) -> Effect b
delayEffect = delay
-- | A state hook is a tuple of value and setter
type State state = Tuple state ((state -> state) -> Effect Unit)
......@@ -49,7 +53,7 @@ type State state = Tuple state ((state -> state) -> Effect Unit)
useState :: forall s. (Unit -> s) -> Hooks (State s)
useState s =
hook $ \_ ->
pure $ currySecond $ tuple $ react ... "useState" $ [ delay unit (pure <<< s) ]
pure $ currySecond $ tuple $ react ... "useState" $ [ delayEffect unit (pure <<< s) ]
useState' :: forall s. s -> Hooks (State s)
useState' = useState <<< const
......@@ -317,7 +321,7 @@ useLayoutEffectFn5' a b c d e f = splay5 useLayoutEffect5' f a b c d e
-- | Given a function to compute an expensive value, returns the value
useMemo :: forall t. (Unit -> t) -> Hooks t
useMemo f = hook $ \_ -> pure $ react ... "useMemo" $ [ delay unit (\_ -> pure (f unit)) ]
useMemo f = hook $ \_ -> pure $ react ... "useMemo" $ [ delayEffect unit (\_ -> pure (f unit)) ]
-- | Like `useMemo` but takes a memo value
useMemo1 :: forall a t. a -> (Unit -> t) -> Hooks t
......@@ -346,13 +350,13 @@ unsafeUseMemo :: forall t a. (Unit -> t) -> a -> Hooks t
unsafeUseMemo f a =
hook $ \_ ->
pure $ react ... "useMemo" $
args2 (delay unit (\_ -> pure (f unit))) (Array.from a)
args2 (delayEffect unit (\_ -> pure (f unit))) (Array.from a)
-- useCallback
-- | Given a function to compute an expensive value, returns the value
useCallback :: forall t. (Unit -> t) -> Hooks (Effect t)
useCallback f = hook $ \_ -> pure $ react ... "useCallback" $ [ delay unit (\_ -> pure (f unit)) ]
useCallback f = hook $ \_ -> pure $ react ... "useCallback" $ [ delayEffect unit (\_ -> pure (f unit)) ]
-- | Like `useCallback` but takes a memo value
useCallback1 :: forall a t. a -> (Unit -> t) -> Hooks (Effect t)
......
module Test.Main where
import Prelude
import Effect (Effect)
import Test.Spec (Spec, describe, it)
import Test.Spec.Assertions (shouldEqual)
import Test.Spec (Spec)
import Test.Spec.Mocha (runMocha)
import Reactix.React.Spec
import Test.Spec.Runner (run)
import Reactix.React.Spec as ReactSpec
......@@ -14,6 +12,5 @@ specs :: Spec Unit
specs = do ReactSpec.spec
main :: Effect Unit
main = do -- >>= run [consoleReporter]
-- specs <- discoverSpecs
runMocha specs
main = do
runMocha $ pure specs
......@@ -10,10 +10,8 @@ import Data.Unfoldable (fromMaybe)
import Effect.Aff (Aff)
import Effect.Class ( liftEffect )
import Effect.Ref as Ref
-- import Effect.Aff (launchAff_)
import Test.Spec ( Spec, describe, it )
import Test.Spec.Assertions ( shouldEqual )
-- import Test.Spec.QuickCheck (quickCheck')
import DOM.Simple.Element as Element
import DOM.Simple.Types (Element)
import FFI.Simple (delay)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment