Skip to content

Commit 2a8cf4f

Browse files
committed
Fix resumable
1 parent 47c1af4 commit 2a8cf4f

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

src/Concur/Core/Patterns.purs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Data.Array as Array
1212
import Data.Either (Either(..), either)
1313
import Data.Foldable (fold)
1414
import Data.Function (applyFlipped, flip, (#), ($), (<<<), (>>>))
15-
import Data.Functor ((<$>), ($>))
15+
import Data.Functor ((<$>))
1616
import Data.Lens (Lens')
1717
import Data.Lens as L
1818
import Data.Maybe (fromMaybe)
@@ -162,30 +162,37 @@ with wire f = do
162162

163163
type ResumableWidget v a =
164164
{ handlerRef :: Ref (Result v a -> Effect Unit)
165+
, view :: Ref v
165166
, canceler :: Effect Unit
166167
}
167168

168169
resumeResumable :: forall v a. ResumableWidget v a -> Widget v a
169-
resumeResumable { handlerRef, canceler } = mkWidget \cb -> Ref.write cb handlerRef $> canceler
170+
resumeResumable { handlerRef, view, canceler } = mkWidget \cb -> do
171+
Ref.write cb handlerRef
172+
v <- Ref.read view
173+
cb (View v)
174+
pure canceler
170175

171176
suspendResumable :: forall v a. ResumableWidget v a -> Effect Unit
172177
suspendResumable { handlerRef } = Ref.write mempty handlerRef
173178

174179
cancelResumable :: forall v a. ResumableWidget v a -> Effect Unit
175180
cancelResumable { canceler } = canceler
176181

177-
runResumable :: forall v a. Widget v a -> (Result v a -> Effect Unit) -> Effect (ResumableWidget v a)
178-
runResumable w handler = do
182+
runToResumable :: forall v a. Widget v a -> Ref v -> (Result v a -> Effect Unit) -> Effect (ResumableWidget v a)
183+
runToResumable w view handler = do
179184
handlerRef <- Ref.new handler
180185
canceler <- runWidget w \res -> Ref.read handlerRef >>= applyFlipped res
181-
pure { handlerRef, canceler }
186+
pure { handlerRef, view, canceler }
182187

183188
resumableOrr :: forall v a. Monoid v => Array (Widget v a) -> Widget v { val :: a, others :: Array (ResumableWidget v a) }
184189
resumableOrr widgets = mkWidget \cb -> do
185190
viewsRef <- Ref.new (Array.replicate (Array.length widgets) mempty)
186191
resumables <- fixEffect \resumables -> forWithIndex widgets \i w -> do
187-
fixEffect \s -> runResumable w case _ of
192+
viewRef <- Ref.new mempty
193+
fixEffect \s -> runToResumable w viewRef case _ of
188194
View v -> do
195+
Ref.write v viewRef
189196
views <- Ref.read viewsRef
190197
Array.updateAt i v views # traverse_ \newViews -> do
191198
Ref.write newViews viewsRef
@@ -195,4 +202,5 @@ resumableOrr widgets = mkWidget \cb -> do
195202
let others = fromMaybe (resumables unit) $ Array.deleteAt i (resumables unit)
196203
traverse_ suspendResumable others
197204
cb (Completed { val, others })
198-
pure do traverse_ _.canceler resumables
205+
pure do traverse_ cancelResumable resumables
206+

0 commit comments

Comments
 (0)