@@ -12,7 +12,7 @@ import Data.Array as Array
1212import Data.Either (Either (..), either )
1313import Data.Foldable (fold )
1414import Data.Function (applyFlipped , flip , (#), ($), (<<<), (>>>))
15- import Data.Functor ((<$>), ($>) )
15+ import Data.Functor ((<$>))
1616import Data.Lens (Lens' )
1717import Data.Lens as L
1818import Data.Maybe (fromMaybe )
@@ -162,30 +162,37 @@ with wire f = do
162162
163163type ResumableWidget v a =
164164 { handlerRef :: Ref (Result v a -> Effect Unit )
165+ , view :: Ref v
165166 , canceler :: Effect Unit
166167 }
167168
168169resumeResumable :: 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
171176suspendResumable :: forall v a . ResumableWidget v a -> Effect Unit
172177suspendResumable { handlerRef } = Ref .write mempty handlerRef
173178
174179cancelResumable :: forall v a . ResumableWidget v a -> Effect Unit
175180cancelResumable { 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
183188resumableOrr :: forall v a . Monoid v => Array (Widget v a ) -> Widget v { val :: a , others :: Array (ResumableWidget v a ) }
184189resumableOrr 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