@@ -5,6 +5,8 @@
55{-# LANGUAGE FlexibleContexts #-}
66{-# LANGUAGE FlexibleInstances #-}
77{-# LANGUAGE MultiParamTypeClasses #-}
8+{-# LANGUAGE PatternSynonyms #-}
9+{-# LANGUAGE ViewPatterns #-}
810{-# LANGUAGE RankNTypes #-}
911
1012#include "inline.hs"
@@ -197,7 +199,7 @@ import Prelude
197199 notElem, null, head, tail, zipWith, lookup, foldr1, sequence,
198200 (!!), scanl, scanl1, concatMap, replicate, enumFromTo)
199201
200−import Streamly.SVar (MonadAsync, State(..), defState, rstState)
202+import Streamly.SVar (MonadAsync, State(..), defState, adaptState)
201203
202204import qualified Streamly.Streams.StreamK as K
203205
@@ -219,7 +221,24 @@ instance Functor (Step s) where
219221-- gst = global state
220222-- | A stream consists of a step function that generates the next step given a
221223-- current state, and the current state.
222−data Stream m a = forall s. Stream (State K.Stream m a -> s -> m (Step s a)) s
224+data Stream m a =
225+ forall s. UnStream (State K.Stream m a -> s -> m (Step s a)) s
226+
227+-- Do not use the UnStream constructor directly, use the pattern synonym
228+-- instead. XXX we should perhaps put the type in a separate module and do not
229+-- export the constructor.
230+
231+detachStream :: Stream m a -> Stream m a
232+detachStream (UnStream step state) = UnStream step' state
233+ where step' gst = step (adaptState gst)
234+
235+pattern Stream :: (State K.Stream m a -> s -> m (Step s a)) -> s -> Stream m a
236+pattern Stream step state <- (detachStream -> UnStream step state)
237+ where Stream = UnStream
238+
239+#if __GLASGOW_HASKELL__ >= 802
240+{-# COMPLETE Stream #-}
241+#endif
223242
224243------------------------------------------------------------------------------
225244-- Construction
@@ -238,7 +257,7 @@ cons x (Stream step state) = Stream step1 Nothing
238257 {-# INLINE_LATE step1 #-}
239258 step1 _ Nothing = return $ Yield x (Just state)
240259 step1 gst (Just st) = do
241− r <- step (rstState gst) st
260+ r <- step gst st
242261 return $
243262 case r of
244263 Yield a s -> Yield a (Just s)
@@ -492,7 +511,6 @@ fromList = Stream step
492511 step _ (x:xs) = return $ Yield x xs
493512 step _ [] = return Stop
494513
495−-- XXX pass the state to streamD
496514{-# INLINE_LATE fromStreamK #-}
497515fromStreamK :: Monad m => K.Stream m a -> Stream m a
498516fromStreamK = Stream step
@@ -773,7 +791,7 @@ findIndices p (Stream step state) = Stream step' (state, 0)
773791 where
774792 {-# INLINE_LATE step' #-}
775793 step' gst (st, i) = do
776− r <- step (rstState gst) st
794+ r <- step (adaptState gst) st
777795 return $ case r of
778796 Yield x s -> if p x then Yield i (s, i+1) else Skip (s, i+1)
779797 Skip s -> Skip (s, i+1)
@@ -785,7 +803,7 @@ concatMapM f (Stream step state) = Stream step' (Left state)
785803 where
786804 {-# INLINE_LATE step' #-}
787805 step' gst (Left st) = do
788− r <- step (rstState gst) st
806+ r <- step (adaptState gst) st
789807 case r of
790808 Yield a s -> do
791809 b_stream <- f a
@@ -935,7 +953,7 @@ prescanlM' f mz (Stream step state) = Stream step' (state, mz)
935953 where
936954 {-# INLINE_LATE step' #-}
937955 step' gst (st, prev) = do
938− r <- step (rstState gst) st
956+ r <- step (adaptState gst) st
939957 case r of
940958 Yield x s -> do
941959 acc <- prev
@@ -963,7 +981,7 @@ postscanlM' fstep begin (Stream step state) =
963981 where
964982 {-# INLINE_LATE step' #-}
965983 step' gst (st, acc) = acc `seq` do
966− r <- step (rstState gst) st
984+ r <- step (adaptState gst) st
967985 case r of
968986 Yield x s -> do
969987 y <- fstep acc x
@@ -981,7 +999,7 @@ postscanlM fstep begin (Stream step state) = Stream step' (state, begin)
981999 where
9821000 {-# INLINE_LATE step' #-}
9831001 step' gst (st, acc) = do
984− r <- step (rstState gst) st
1002+ r <- step (adaptState gst) st
9851003 case r of
9861004 Yield x s -> do
9871005 y <- fstep acc x
@@ -1015,14 +1033,14 @@ scanl1M fstep (Stream step state) = Stream step' (state, Nothing)
10151033 where
10161034 {-# INLINE_LATE step' #-}
10171035 step' gst (st, Nothing) = do
1018− r <- step (rstState gst) st
1036+ r <- step gst st
10191037 case r of
10201038 Yield x s -> return $ Yield x (s, Just x)
10211039 Skip s -> return $ Skip (s, Nothing)
10221040 Stop -> return Stop
10231041
10241042 step' gst (st, Just acc) = do
1025− r <- step (rstState gst) st
1043+ r <- step gst st
10261044 case r of
10271045 Yield y s -> do
10281046 z <- fstep acc y
@@ -1040,14 +1058,14 @@ scanl1M' fstep (Stream step state) = Stream step' (state, Nothing)
10401058 where
10411059 {-# INLINE_LATE step' #-}
10421060 step' gst (st, Nothing) = do
1043− r <- step (rstState gst) st
1061+ r <- step gst st
10441062 case r of
10451063 Yield x s -> x `seq` return $ Yield x (s, Just x)
10461064 Skip s -> return $ Skip (s, Nothing)
10471065 Stop -> return Stop
10481066
10491067 step' gst (st, Just acc) = acc `seq` do
1050− r <- step (rstState gst) st
1068+ r <- step gst st
10511069 case r of
10521070 Yield y s -> do
10531071 z <- fstep acc y
@@ -1069,7 +1087,7 @@ take n (Stream step state) = n `seq` Stream step' (state, 0)
10691087 where
10701088 {-# INLINE_LATE step' #-}
10711089 step' gst (st, i) | i < n = do
1072− r <- step (rstState gst) st
1090+ r <- step gst st
10731091 return $ case r of
10741092 Yield x s -> Yield x (s, i + 1)
10751093 Skip s -> Skip (s, i)
@@ -1082,7 +1100,7 @@ takeWhileM f (Stream step state) = Stream step' state
10821100 where
10831101 {-# INLINE_LATE step' #-}
10841102 step' gst st = do
1085− r <- step (rstState gst) st
1103+ r <- step gst st
10861104 case r of
10871105 Yield x s -> do
10881106 b <- f x
@@ -1101,7 +1119,7 @@ drop n (Stream step state) = Stream step' (state, Just n)
11011119 {-# INLINE_LATE step' #-}
11021120 step' gst (st, Just i)
11031121 | i > 0 = do
1104− r <- step (rstState gst) st
1122+ r <- step gst st
11051123 return $
11061124 case r of
11071125 Yield _ s -> Skip (s, Just (i - 1))
@@ -1110,7 +1128,7 @@ drop n (Stream step state) = Stream step' (state, Just n)
11101128 | otherwise = return $ Skip (st, Nothing)
11111129
11121130 step' gst (st, Nothing) = do
1113− r <- step (rstState gst) st
1131+ r <- step gst st
11141132 return $
11151133 case r of
11161134 Yield x s -> Yield x (s, Nothing)
@@ -1128,7 +1146,7 @@ dropWhileM f (Stream step state) = Stream step' (DropWhileDrop state)
11281146 where
11291147 {-# INLINE_LATE step' #-}
11301148 step' gst (DropWhileDrop st) = do
1131− r <- step (rstState gst) st
1149+ r <- step gst st
11321150 case r of
11331151 Yield x s -> do
11341152 b <- f x
@@ -1139,7 +1157,7 @@ dropWhileM f (Stream step state) = Stream step' (DropWhileDrop state)
11391157 Stop -> return Stop
11401158
11411159 step' gst (DropWhileNext st) = do
1142− r <- step (rstState gst) st
1160+ r <- step gst st
11431161 case r of
11441162 Yield x s -> return $ Skip (DropWhileYield x s)
11451163 Skip s -> return $ Skip (DropWhileNext s)
@@ -1157,7 +1175,7 @@ filterM f (Stream step state) = Stream step' state
11571175 where
11581176 {-# INLINE_LATE step' #-}
11591177 step' gst st = do
1160− r <- step (rstState gst) st
1178+ r <- step gst st
11611179 case r of
11621180 Yield x s -> do
11631181 b <- f x
@@ -1177,13 +1195,13 @@ uniq (Stream step state) = Stream step' (Nothing, state)
11771195 where
11781196 {-# INLINE_LATE step' #-}
11791197 step' gst (Nothing, st) = do
1180− r <- step (rstState gst) st
1198+ r <- step gst st
11811199 case r of
11821200 Yield x s -> return $ Yield x (Just x, s)
11831201 Skip s -> return $ Skip (Nothing, s)
11841202 Stop -> return Stop
11851203 step' gst (Just x, st) = do
1186− r <- step (rstState gst) st
1204+ r <- step gst st
11871205 case r of
11881206 Yield y s | x == y -> return $ Skip (Just x, s)
11891207 | otherwise -> return $ Yield x (Just y, s)
@@ -1201,7 +1219,7 @@ mapM f (Stream step state) = Stream step' state
12011219 where
12021220 {-# INLINE_LATE step' #-}
12031221 step' gst st = do
1204− r <- step (rstState gst) st
1222+ r <- step (adaptState gst) st
12051223 case r of
12061224 Yield x s -> f x >>= \a -> return $ Yield a s
12071225 Skip s -> return $ Skip s
@@ -1217,7 +1235,7 @@ sequence (Stream step state) = Stream step' state
12171235 where
12181236 {-# INLINE_LATE step' #-}
12191237 step' gst st = do
1220− r <- step (rstState gst) st
1238+ r <- step (adaptState gst) st
12211239 case r of
12221240 Yield x s -> x >>= \a -> return (Yield a s)
12231241 Skip s -> return $ Skip s
@@ -1233,7 +1251,7 @@ insertBy cmp a (Stream step state) = Stream step' (state, False, Nothing)
12331251 where
12341252 {-# INLINE_LATE step' #-}
12351253 step' gst (st, False, _) = do
1236− r <- step (rstState gst) st
1254+ r <- step gst st
12371255 case r of
12381256 Yield x s -> case cmp a x of
12391257 GT -> return $ Yield x (s, False, Nothing)
@@ -1244,7 +1262,7 @@ insertBy cmp a (Stream step state) = Stream step' (state, False, Nothing)
12441262 step' _ (_, True, Nothing) = return Stop
12451263
12461264 step' gst (st, True, Just prev) = do
1247− r <- step (rstState gst) st
1265+ r <- step gst st
12481266 case r of
12491267 Yield x s -> return $ Yield prev (s, True, Just x)
12501268 Skip s -> return $ Skip (s, True, Just prev)
@@ -1260,7 +1278,7 @@ deleteBy eq x (Stream step state) = Stream step' (state, False)
12601278 where
12611279 {-# INLINE_LATE step' #-}
12621280 step' gst (st, False) = do
1263− r <- step (rstState gst) st
1281+ r <- step gst st
12641282 case r of
12651283 Yield y s -> return $
12661284 if eq x y then Skip (s, True) else Yield y (s, False)
@@ -1268,7 +1286,7 @@ deleteBy eq x (Stream step state) = Stream step' (state, False)
12681286 Stop -> return Stop
12691287
12701288 step' gst (st, True) = do
1271− r <- step (rstState gst) st
1289+ r <- step gst st
12721290 case r of
12731291 Yield y s -> return $ Yield y (s, True)
12741292 Skip s -> return $ Skip (s, True)
@@ -1297,7 +1315,7 @@ indexed (Stream step state) = Stream step' (state, 0)
12971315 where
12981316 {-# INLINE_LATE step' #-}
12991317 step' gst (st, i) = i `seq` do
1300− r <- step (rstState gst) st
1318+ r <- step (adaptState gst) st
13011319 case r of
13021320 Yield x s -> return $ Yield (i, x) (s, i+1)
13031321 Skip s -> return $ Skip (s, i)
@@ -1309,7 +1327,7 @@ indexedR m (Stream step state) = Stream step' (state, m)
13091327 where
13101328 {-# INLINE_LATE step' #-}
13111329 step' gst (st, i) = i `seq` do
1312− r <- step (rstState gst) st
1330+ r <- step (adaptState gst) st
13131331 case r of
13141332 Yield x s -> let i' = i - 1
13151333 in
@@ -1324,7 +1342,7 @@ zipWithM f (Stream stepa ta) (Stream stepb tb) = Stream step (ta, tb, Nothing)
13241342 where
13251343 {-# INLINE_LATE step #-}
13261344 step gst (sa, sb, Nothing) = do
1327− r <- stepa (rstState gst) sa
1345+ r <- stepa (adaptState gst) sa
13281346 return $
13291347 case r of
13301348 Yield x sa' -> Skip (sa', sb, Just x)
@@ -1332,7 +1350,7 @@ zipWithM f (Stream stepa ta) (Stream stepb tb) = Stream step (ta, tb, Nothing)
13321350 Stop -> Stop
13331351
13341352 step gst (sa, sb, Just x) = do
1335− r <- stepb (rstState gst) sb
1353+ r <- stepb (adaptState gst) sb
13361354 case r of
13371355 Yield y sb' -> do
13381356 z <- f x y
@@ -1423,14 +1441,14 @@ mergeByM cmp (Stream stepa ta) (Stream stepb tb) =
14231441
14241442 -- one of the values is missing, and the corresponding stream is running
14251443 step gst (Just sa, sb, Nothing, b) = do
1426− r <- stepa (rstState gst) sa
1444+ r <- stepa gst sa
14271445 return $ case r of
14281446 Yield a sa' -> Skip (Just sa', sb, Just a, b)
14291447 Skip sa' -> Skip (Just sa', sb, Nothing, b)
14301448 Stop -> Skip (Nothing, sb, Nothing, b)
14311449
14321450 step gst (sa, Just sb, a, Nothing) = do
1433− r <- stepb (rstState gst) sb
1451+ r <- stepb gst sb
14341452 return $ case r of
14351453 Yield b sb' -> Skip (sa, Just sb', a, Just b)
14361454 Skip sb' -> Skip (sa, Just sb', a, Nothing)