Skip to content

Commit cfa94be

Browse files
Only recheck useTickEffect memos when running effects modified state (#28)
Previously, when using `useTickEffect`, Hooks would re-evaluate after effects were run just in case the effects touched state that could have been a dependency for a tick effect. Now, we track a dirty flag in state and only re-evaluate hooks if an effect actually modified state.
1 parent 91733d3 commit cfa94be

6 files changed

Lines changed: 16 additions & 14 deletions

File tree

src/Halogen/Hooks/Component.purs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,5 +122,6 @@ memoComponent eqInput inputHookFn = do
122122
, memoCells: { queue: [], index: 0 }
123123
, refCells: { queue: [], index: 0 }
124124
, evalQueue: []
125+
, stateDirty: false
125126
}
126127
}

src/Halogen/Hooks/Internal/Eval.purs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,16 @@ mkEval inputEq runHookM runHook hookFn = case _ of
7070
_ <- runHook reason hookFn
7171
{ evalQueue } <- getState
7272

73-
if Array.null evalQueue then
74-
H.gets (_.result <<< unwrap)
75-
76-
else do
77-
modifyState_ _ { evalQueue = [] }
73+
when (not (Array.null evalQueue)) do
74+
modifyState_ _ { evalQueue = [], stateDirty = false }
7875
sequence_ evalQueue
76+
{ stateDirty } <- getState
7977

80-
if (reason == Initialize || reason == Step) then
81-
runHookAndEffects Step
78+
let initializeOrStepReason = reason == Initialize || reason == Step
79+
when (stateDirty && initializeOrStepReason) do
80+
void $ runHookAndEffects Step
8281

83-
else
84-
H.gets (_.result <<< unwrap)
82+
H.gets (_.result <<< unwrap)
8583

8684
interpretHook
8785
:: forall hooks q i m a
@@ -286,7 +284,10 @@ evalHookM runHooks (HookM evalUseHookF) = foldFree interpretHalogenHook evalUseH
286284
-- ensure calls to `get` don't trigger evaluations.
287285
unless (unsafeRefEq current next) do
288286
let newQueue = unsafeSetCell token next
289-
putState $ state { stateCells { queue = newQueue state.stateCells.queue } }
287+
putState $ state
288+
{ stateCells { queue = newQueue state.stateCells.queue }
289+
, stateDirty = true
290+
}
290291
void runHooks
291292

292293
pure (reply next)

src/Halogen/Hooks/Internal/Eval/Types.purs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type InternalHookState q i m a =
6060
, effectCells :: QueueState ((Maybe MemoValues) /\ HookM m Unit)
6161
, memoCells :: QueueState (MemoValues /\ MemoValue)
6262
, refCells :: QueueState (Ref RefValue)
63+
, stateDirty :: Boolean
6364
}
6465

6566
type QueueState a =

test/Test/Hooks/UseEffect/UseLifecycleEffect.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ lifecycleEffectHook = before initDriver $ describe "useLifecycleEffect" do
6363

6464
where
6565
initializeSteps =
66-
[ RunHooks Initialize, Render, RunEffect (EffectBody 0), RunHooks Step, Render ]
66+
[ RunHooks Initialize, Render, RunEffect (EffectBody 0) ]
6767

6868
finalizeSteps =
6969
[ RunHooks Finalize, Render, RunEffect (EffectCleanup 0) ]

test/Test/Hooks/UseEffect/UseTickEffect.purs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@ tickEffectHook = before initDriver $ describe "useTickEffect" do
6565
, Render
6666
, RunEffect (EffectCleanup 0)
6767
, RunEffect (EffectBody 0)
68-
, RunHooks Step
69-
, Render
7068
]
7169
, finalizeSteps
7270
]
@@ -91,7 +89,7 @@ tickEffectHook = before initDriver $ describe "useTickEffect" do
9189

9290
where
9391
initializeSteps =
94-
[ RunHooks Initialize, Render, RunEffect (EffectBody 0), RunHooks Step, Render ]
92+
[ RunHooks Initialize, Render, RunEffect (EffectBody 0) ]
9593

9694
finalizeSteps =
9795
[ RunHooks Finalize, Render, RunEffect (EffectCleanup 0) ]

test/Test/Setup/Eval.purs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ initDriver = liftEffect do
146146
, memoCells: { queue: [], index: 0 }
147147
, refCells: { queue: [], index: 0 }
148148
, evalQueue: []
149+
, stateDirty: false
149150
}
150151

151152
lifecycleHandlers <- Ref.new mempty

0 commit comments

Comments
 (0)