@@ -5,6 +5,8 @@
5{-# LANGUAGE FlexibleContexts #-}
5{-# LANGUAGE FlexibleContexts #-}
6{-# LANGUAGE FlexibleInstances #-}
6{-# LANGUAGE FlexibleInstances #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
8+{-# LANGUAGE PatternSynonyms #-}
9+{-# LANGUAGE ViewPatterns #-}
8{-# LANGUAGE RankNTypes #-}
10{-# LANGUAGE RankNTypes #-}
10#include "inline.hs"
12#include "inline.hs"
@@ -197,7 +199,7 @@ import Prelude
197 notElem, null, head, tail, zipWith, lookup, foldr1, sequence,
199 notElem, null, head, tail, zipWith, lookup, foldr1, sequence,
198 (!!), scanl, scanl1, concatMap, replicate, enumFromTo)
200 (!!), scanl, scanl1, concatMap, replicate, enumFromTo)
200−import Streamly.SVar (MonadAsync, State(..), defState, rstState)
202+import Streamly.SVar (MonadAsync, State(..), defState, adaptState)
202import qualified Streamly.Streams.StreamK as K
204import qualified Streamly.Streams.StreamK as K
@@ -219,7 +221,24 @@ instance Functor (Step s) where
219-- gst = global state
221-- gst = global state
220-- | A stream consists of a step function that generates the next step given a
222-- | A stream consists of a step function that generates the next step given a
221-- current state, and the current state.
223-- current state, and the current state.
225+ forall s. UnStream (State K.Stream m a -> s -> m (Step s a)) s
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.
231+detachStream :: Stream m a -> Stream m a
232+detachStream (UnStream step state) = UnStream step' state
233+ where step' gst = step (adaptState gst)
222−data Stream m a = forall s. Stream (State K.Stream m a -> s -> m (Step s a)) s
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
239+#if __GLASGOW_HASKELL__ >= 802
240+{-# COMPLETE Stream #-}
224------------------------------------------------------------------------------
243------------------------------------------------------------------------------
225-- Construction
244-- Construction
@@ -238,7 +257,7 @@ cons x (Stream step state) = Stream step1 Nothing
238 {-# INLINE_LATE step1 #-}
257 {-# INLINE_LATE step1 #-}
239 step1 _ Nothing = return $ Yield x (Just state)
258 step1 _ Nothing = return $ Yield x (Just state)
240 step1 gst (Just st) = do
259 step1 gst (Just st) = do
241− r <- step (rstState gst) st
260+ r <- step gst st
243 case r of
262 case r of
244 Yield a s -> Yield a (Just s)
263 Yield a s -> Yield a (Just s)
@@ -492,7 +511,6 @@ fromList = Stream step
492 step _ (x:xs) = return $ Yield x xs
511 step _ (x:xs) = return $ Yield x xs
493 step _ [] = return Stop
512 step _ [] = return Stop
495−-- XXX pass the state to streamD
496{-# INLINE_LATE fromStreamK #-}
514{-# INLINE_LATE fromStreamK #-}
497fromStreamK :: Monad m => K.Stream m a -> Stream m a
515fromStreamK :: Monad m => K.Stream m a -> Stream m a
498fromStreamK = Stream step
516fromStreamK = Stream step
@@ -773,7 +791,7 @@ findIndices p (Stream step state) = Stream step' (state, 0)
774 {-# INLINE_LATE step' #-}
792 {-# INLINE_LATE step' #-}
775 step' gst (st, i) = do
793 step' gst (st, i) = do
776− r <- step (rstState gst) st
794+ r <- step (adaptState gst) st
777 return $ case r of
795 return $ case r of
778 Yield x s -> if p x then Yield i (s, i+1) else Skip (s, i+1)
796 Yield x s -> if p x then Yield i (s, i+1) else Skip (s, i+1)
779 Skip s -> Skip (s, i+1)
797 Skip s -> Skip (s, i+1)
@@ -785,7 +803,7 @@ concatMapM f (Stream step state) = Stream step' (Left state)
786 {-# INLINE_LATE step' #-}
804 {-# INLINE_LATE step' #-}
787 step' gst (Left st) = do
805 step' gst (Left st) = do
788− r <- step (rstState gst) st
806+ r <- step (adaptState gst) st
789 case r of
807 case r of
790 Yield a s -> do
808 Yield a s -> do
791 b_stream <- f a
809 b_stream <- f a
@@ -935,7 +953,7 @@ prescanlM' f mz (Stream step state) = Stream step' (state, mz)
936 {-# INLINE_LATE step' #-}
954 {-# INLINE_LATE step' #-}
937 step' gst (st, prev) = do
955 step' gst (st, prev) = do
938− r <- step (rstState gst) st
956+ r <- step (adaptState gst) st
939 case r of
957 case r of
940 Yield x s -> do
958 Yield x s -> do
941 acc <- prev
959 acc <- prev
@@ -963,7 +981,7 @@ postscanlM' fstep begin (Stream step state) =
964 {-# INLINE_LATE step' #-}
982 {-# INLINE_LATE step' #-}
965 step' gst (st, acc) = acc `seq` do
983 step' gst (st, acc) = acc `seq` do
966− r <- step (rstState gst) st
984+ r <- step (adaptState gst) st
967 case r of
985 case r of
968 Yield x s -> do
986 Yield x s -> do
969 y <- fstep acc x
987 y <- fstep acc x
@@ -981,7 +999,7 @@ postscanlM fstep begin (Stream step state) = Stream step' (state, begin)
982 {-# INLINE_LATE step' #-}
1000 {-# INLINE_LATE step' #-}
983 step' gst (st, acc) = do
1001 step' gst (st, acc) = do
984− r <- step (rstState gst) st
1002+ r <- step (adaptState gst) st
985 case r of
1003 case r of
986 Yield x s -> do
1004 Yield x s -> do
987 y <- fstep acc x
1005 y <- fstep acc x
@@ -1015,14 +1033,14 @@ scanl1M fstep (Stream step state) = Stream step' (state, Nothing)
1016 {-# INLINE_LATE step' #-}
1034 {-# INLINE_LATE step' #-}
1017 step' gst (st, Nothing) = do
1035 step' gst (st, Nothing) = do
1018− r <- step (rstState gst) st
1036+ r <- step gst st
1019 case r of
1037 case r of
1020 Yield x s -> return $ Yield x (s, Just x)
1038 Yield x s -> return $ Yield x (s, Just x)
1021 Skip s -> return $ Skip (s, Nothing)
1039 Skip s -> return $ Skip (s, Nothing)
1022 Stop -> return Stop
1040 Stop -> return Stop
1024 step' gst (st, Just acc) = do
1042 step' gst (st, Just acc) = do
1025− r <- step (rstState gst) st
1043+ r <- step gst st
1026 case r of
1044 case r of
1027 Yield y s -> do
1045 Yield y s -> do
1028 z <- fstep acc y
1046 z <- fstep acc y
@@ -1040,14 +1058,14 @@ scanl1M' fstep (Stream step state) = Stream step' (state, Nothing)
1041 {-# INLINE_LATE step' #-}
1059 {-# INLINE_LATE step' #-}
1042 step' gst (st, Nothing) = do
1060 step' gst (st, Nothing) = do
1043− r <- step (rstState gst) st
1061+ r <- step gst st
1044 case r of
1062 case r of
1045 Yield x s -> x `seq` return $ Yield x (s, Just x)
1063 Yield x s -> x `seq` return $ Yield x (s, Just x)
1046 Skip s -> return $ Skip (s, Nothing)
1064 Skip s -> return $ Skip (s, Nothing)
1047 Stop -> return Stop
1065 Stop -> return Stop
1049 step' gst (st, Just acc) = acc `seq` do
1067 step' gst (st, Just acc) = acc `seq` do
1050− r <- step (rstState gst) st
1068+ r <- step gst st
1051 case r of
1069 case r of
1052 Yield y s -> do
1070 Yield y s -> do
1053 z <- fstep acc y
1071 z <- fstep acc y
@@ -1069,7 +1087,7 @@ take n (Stream step state) = n `seq` Stream step' (state, 0)
1070 {-# INLINE_LATE step' #-}
1088 {-# INLINE_LATE step' #-}
1071 step' gst (st, i) | i < n = do
1089 step' gst (st, i) | i < n = do
1072− r <- step (rstState gst) st
1090+ r <- step gst st
1073 return $ case r of
1091 return $ case r of
1074 Yield x s -> Yield x (s, i + 1)
1092 Yield x s -> Yield x (s, i + 1)
1075 Skip s -> Skip (s, i)
1093 Skip s -> Skip (s, i)
@@ -1082,7 +1100,7 @@ takeWhileM f (Stream step state) = Stream step' state
1083 {-# INLINE_LATE step' #-}
1101 {-# INLINE_LATE step' #-}
1084 step' gst st = do
1102 step' gst st = do
1085− r <- step (rstState gst) st
1103+ r <- step gst st
1086 case r of
1104 case r of
1087 Yield x s -> do
1105 Yield x s -> do
1088 b <- f x
1106 b <- f x
@@ -1101,7 +1119,7 @@ drop n (Stream step state) = Stream step' (state, Just n)
1101 {-# INLINE_LATE step' #-}
1119 {-# INLINE_LATE step' #-}
1102 step' gst (st, Just i)
1120 step' gst (st, Just i)
1103 | i > 0 = do
1121 | i > 0 = do
1104− r <- step (rstState gst) st
1122+ r <- step gst st
1105 return $
1123 return $
1106 case r of
1124 case r of
1107 Yield _ s -> Skip (s, Just (i - 1))
1125 Yield _ s -> Skip (s, Just (i - 1))
@@ -1110,7 +1128,7 @@ drop n (Stream step state) = Stream step' (state, Just n)
1110 | otherwise = return $ Skip (st, Nothing)
1128 | otherwise = return $ Skip (st, Nothing)
1112 step' gst (st, Nothing) = do
1130 step' gst (st, Nothing) = do
1113− r <- step (rstState gst) st
1131+ r <- step gst st
1114 return $
1132 return $
1115 case r of
1133 case r of
1116 Yield x s -> Yield x (s, Nothing)
1134 Yield x s -> Yield x (s, Nothing)
@@ -1128,7 +1146,7 @@ dropWhileM f (Stream step state) = Stream step' (DropWhileDrop state)
1129 {-# INLINE_LATE step' #-}
1147 {-# INLINE_LATE step' #-}
1130 step' gst (DropWhileDrop st) = do
1148 step' gst (DropWhileDrop st) = do
1131− r <- step (rstState gst) st
1149+ r <- step gst st
1132 case r of
1150 case r of
1133 Yield x s -> do
1151 Yield x s -> do
1134 b <- f x
1152 b <- f x
@@ -1139,7 +1157,7 @@ dropWhileM f (Stream step state) = Stream step' (DropWhileDrop state)
1139 Stop -> return Stop
1157 Stop -> return Stop
1141 step' gst (DropWhileNext st) = do
1159 step' gst (DropWhileNext st) = do
1142− r <- step (rstState gst) st
1160+ r <- step gst st
1143 case r of
1161 case r of
1144 Yield x s -> return $ Skip (DropWhileYield x s)
1162 Yield x s -> return $ Skip (DropWhileYield x s)
1145 Skip s -> return $ Skip (DropWhileNext s)
1163 Skip s -> return $ Skip (DropWhileNext s)
@@ -1157,7 +1175,7 @@ filterM f (Stream step state) = Stream step' state
1158 {-# INLINE_LATE step' #-}
1176 {-# INLINE_LATE step' #-}
1159 step' gst st = do
1177 step' gst st = do
1160− r <- step (rstState gst) st
1178+ r <- step gst st
1161 case r of
1179 case r of
1162 Yield x s -> do
1180 Yield x s -> do
1163 b <- f x
1181 b <- f x
@@ -1177,13 +1195,13 @@ uniq (Stream step state) = Stream step' (Nothing, state)
1178 {-# INLINE_LATE step' #-}
1196 {-# INLINE_LATE step' #-}
1179 step' gst (Nothing, st) = do
1197 step' gst (Nothing, st) = do
1180− r <- step (rstState gst) st
1198+ r <- step gst st
1181 case r of
1199 case r of
1182 Yield x s -> return $ Yield x (Just x, s)
1200 Yield x s -> return $ Yield x (Just x, s)
1183 Skip s -> return $ Skip (Nothing, s)
1201 Skip s -> return $ Skip (Nothing, s)
1184 Stop -> return Stop
1202 Stop -> return Stop
1185 step' gst (Just x, st) = do
1203 step' gst (Just x, st) = do
1186− r <- step (rstState gst) st
1204+ r <- step gst st
1187 case r of
1205 case r of
1188 Yield y s | x == y -> return $ Skip (Just x, s)
1206 Yield y s | x == y -> return $ Skip (Just x, s)
1189 | otherwise -> return $ Yield x (Just y, s)
1207 | otherwise -> return $ Yield x (Just y, s)
@@ -1201,7 +1219,7 @@ mapM f (Stream step state) = Stream step' state
1202 {-# INLINE_LATE step' #-}
1220 {-# INLINE_LATE step' #-}
1203 step' gst st = do
1221 step' gst st = do
1204− r <- step (rstState gst) st
1222+ r <- step (adaptState gst) st
1205 case r of
1223 case r of
1206 Yield x s -> f x >>= \a -> return $ Yield a s
1224 Yield x s -> f x >>= \a -> return $ Yield a s
1207 Skip s -> return $ Skip s
1225 Skip s -> return $ Skip s
@@ -1217,7 +1235,7 @@ sequence (Stream step state) = Stream step' state
1218 {-# INLINE_LATE step' #-}
1236 {-# INLINE_LATE step' #-}
1219 step' gst st = do
1237 step' gst st = do
1220− r <- step (rstState gst) st
1238+ r <- step (adaptState gst) st
1221 case r of
1239 case r of
1222 Yield x s -> x >>= \a -> return (Yield a s)
1240 Yield x s -> x >>= \a -> return (Yield a s)
1223 Skip s -> return $ Skip s
1241 Skip s -> return $ Skip s
@@ -1233,7 +1251,7 @@ insertBy cmp a (Stream step state) = Stream step' (state, False, Nothing)
1234 {-# INLINE_LATE step' #-}
1252 {-# INLINE_LATE step' #-}
1235 step' gst (st, False, _) = do
1253 step' gst (st, False, _) = do
1236− r <- step (rstState gst) st
1254+ r <- step gst st
1237 case r of
1255 case r of
1238 Yield x s -> case cmp a x of
1256 Yield x s -> case cmp a x of
1239 GT -> return $ Yield x (s, False, Nothing)
1257 GT -> return $ Yield x (s, False, Nothing)
@@ -1244,7 +1262,7 @@ insertBy cmp a (Stream step state) = Stream step' (state, False, Nothing)
1244 step' _ (_, True, Nothing) = return Stop
1262 step' _ (_, True, Nothing) = return Stop
1246 step' gst (st, True, Just prev) = do
1264 step' gst (st, True, Just prev) = do
1247− r <- step (rstState gst) st
1265+ r <- step gst st
1248 case r of
1266 case r of
1249 Yield x s -> return $ Yield prev (s, True, Just x)
1267 Yield x s -> return $ Yield prev (s, True, Just x)
1250 Skip s -> return $ Skip (s, True, Just prev)
1268 Skip s -> return $ Skip (s, True, Just prev)
@@ -1260,7 +1278,7 @@ deleteBy eq x (Stream step state) = Stream step' (state, False)
1261 {-# INLINE_LATE step' #-}
1279 {-# INLINE_LATE step' #-}
1262 step' gst (st, False) = do
1280 step' gst (st, False) = do
1263− r <- step (rstState gst) st
1281+ r <- step gst st
1264 case r of
1282 case r of
1265 Yield y s -> return $
1283 Yield y s -> return $
1266 if eq x y then Skip (s, True) else Yield y (s, False)
1284 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)
1268 Stop -> return Stop
1286 Stop -> return Stop
1270 step' gst (st, True) = do
1288 step' gst (st, True) = do
1271− r <- step (rstState gst) st
1289+ r <- step gst st
1272 case r of
1290 case r of
1273 Yield y s -> return $ Yield y (s, True)
1291 Yield y s -> return $ Yield y (s, True)
1274 Skip s -> return $ Skip (s, True)
1292 Skip s -> return $ Skip (s, True)
@@ -1297,7 +1315,7 @@ indexed (Stream step state) = Stream step' (state, 0)
1298 {-# INLINE_LATE step' #-}
1316 {-# INLINE_LATE step' #-}
1299 step' gst (st, i) = i `seq` do
1317 step' gst (st, i) = i `seq` do
1300− r <- step (rstState gst) st
1318+ r <- step (adaptState gst) st
1301 case r of
1319 case r of
1302 Yield x s -> return $ Yield (i, x) (s, i+1)
1320 Yield x s -> return $ Yield (i, x) (s, i+1)
1303 Skip s -> return $ Skip (s, i)
1321 Skip s -> return $ Skip (s, i)
@@ -1309,7 +1327,7 @@ indexedR m (Stream step state) = Stream step' (state, m)
1310 {-# INLINE_LATE step' #-}
1328 {-# INLINE_LATE step' #-}
1311 step' gst (st, i) = i `seq` do
1329 step' gst (st, i) = i `seq` do
1312− r <- step (rstState gst) st
1330+ r <- step (adaptState gst) st
1313 case r of
1331 case r of
1314 Yield x s -> let i' = i - 1
1332 Yield x s -> let i' = i - 1
@@ -1324,7 +1342,7 @@ zipWithM f (Stream stepa ta) (Stream stepb tb) = Stream step (ta, tb, Nothing)
1325 {-# INLINE_LATE step #-}
1343 {-# INLINE_LATE step #-}
1326 step gst (sa, sb, Nothing) = do
1344 step gst (sa, sb, Nothing) = do
1327− r <- stepa (rstState gst) sa
1345+ r <- stepa (adaptState gst) sa
1328 return $
1346 return $
1329 case r of
1347 case r of
1330 Yield x sa' -> Skip (sa', sb, Just x)
1348 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)
1332 Stop -> Stop
1350 Stop -> Stop
1334 step gst (sa, sb, Just x) = do
1352 step gst (sa, sb, Just x) = do
1335− r <- stepb (rstState gst) sb
1353+ r <- stepb (adaptState gst) sb
1336 case r of
1354 case r of
1337 Yield y sb' -> do
1355 Yield y sb' -> do
1338 z <- f x y
1356 z <- f x y
@@ -1423,14 +1441,14 @@ mergeByM cmp (Stream stepa ta) (Stream stepb tb) =
1424 -- one of the values is missing, and the corresponding stream is running
1442 -- one of the values is missing, and the corresponding stream is running
1425 step gst (Just sa, sb, Nothing, b) = do
1443 step gst (Just sa, sb, Nothing, b) = do
1426− r <- stepa (rstState gst) sa
1444+ r <- stepa gst sa
1427 return $ case r of
1445 return $ case r of
1428 Yield a sa' -> Skip (Just sa', sb, Just a, b)
1446 Yield a sa' -> Skip (Just sa', sb, Just a, b)
1429 Skip sa' -> Skip (Just sa', sb, Nothing, b)
1447 Skip sa' -> Skip (Just sa', sb, Nothing, b)
1430 Stop -> Skip (Nothing, sb, Nothing, b)
1448 Stop -> Skip (Nothing, sb, Nothing, b)
1432 step gst (sa, Just sb, a, Nothing) = do
1450 step gst (sa, Just sb, a, Nothing) = do
1433− r <- stepb (rstState gst) sb
1451+ r <- stepb gst sb
1434 return $ case r of
1452 return $ case r of
1435 Yield b sb' -> Skip (sa, Just sb', a, Just b)
1453 Yield b sb' -> Skip (sa, Just sb', a, Just b)
1436 Skip sb' -> Skip (sa, Just sb', a, Nothing)
1454 Skip sb' -> Skip (sa, Just sb', a, Nothing)