@@ -380,15 +380,50 @@ transform (Pipe pstep1 pstep2 pinitial) (Fold fstep finitial fextract) =
380380
381381 extract (Tuple' _ fs) = fextract fs
382382
383−-- See StreamD/Transform.scanOnce for implementing this.
384−--
385383-- | Scan the input of a 'Fold' to change it in a stateful manner using another
386384-- 'Fold'.
387−--
388−-- /Unimplemented/
385+-- XXX if any Fold is done assuming finish the resulting Fold?
386+-- /Pre-release/
389387{-# INLINE scan #-}
390−scan :: Fold m a b -> Fold m b c -> Fold m a c
391−scan = undefined
388+scan :: Monad m => Fold m a b -> Fold m b c -> Fold m a c
389+scan (Fold stepL initialL extractL) (Fold stepR initialR extractR) =
390+ Fold step initial extract
391+
392+ where
393+
394+ initial = do
395+ r1 <- initialL
396+ r2 <- initialR
397+ case r1 of
398+ Done b1 -> return $ case r2 of
399+ Done b2 -> Done b2
400+ Partial fs2 -> Partial (Nothing, Just fs2, b1)
401+ Partial fs -> return $ case r2 of
402+ Done b2 -> Done b2
403+ Partial fs2 -> Partial (Just fs, Just fs2, undefined)
404+
405+ step (Just s1, s2, _) x = do
406+ r1 <- stepL s1 x
407+ case r1 of
408+ Done b -> do
409+ r2 <- stepR (fromJust s2) b
410+ case r2 of
411+ Partial fs2 -> Done <$> extractR fs2
412+ Done b2 -> return $ Done b2
413+ Partial fs -> do
414+ !b <- extractL fs
415+ r2 <- stepR (fromJust s2) b
416+ return $ case r2 of
417+ Partial fs2 -> Partial (Just fs, Just fs2, undefined)
418+ Done b2 -> Done b2
419+
420+ step (Nothing, s2, b1) _ = do
421+ r2 <- stepR (fromJust s2) b1
422+ case r2 of
423+ Partial fs2 -> Done <$> extractR fs2
424+ Done b2 -> return $ Done b2
425+
426+ extract (_, s2, _) = extractR (fromJust s2)
392427
393428------------------------------------------------------------------------------
394429-- Left folds