@@ -124,7 +124,7 @@ import GHC.Word (Word8)
124124import System.Mem (performMajorGC)
125125import Test.Hspec.QuickCheck
126126import Test.Hspec
127−import Test.QuickCheck (Property, choose, forAll, withMaxSuccess)
127+import Test.QuickCheck (Property, choose, forAll, listOf, withMaxSuccess)
128128import Test.QuickCheck.Monadic (assert, monadicIO, run)
129129
130130import Streamly.Prelude (SerialT, IsStream, (.:), nil, (|&), fromSerial)
@@ -134,6 +134,7 @@ import Streamly.Prelude (avgRate, rate, maxBuffer, maxThreads)
134134import qualified Streamly.Prelude as S
135135import qualified Streamly.Data.Fold as FL
136136import qualified Streamly.Internal.Data.Stream.IsStream as S
137+import qualified Streamly.Internal.Data.Stream.IsStream.Common as IS
137138import qualified Streamly.Internal.Data.Unfold as UF
138139
139140import qualified Data.Map.Strict as Map
@@ -1074,6 +1075,13 @@ transformCombineFromList constr eq listOp t op a b c =
10741075 let list = a <> listOp (b <> c)
10751076 listEquals eq stream list
10761077
1078+takeEndBy :: Property
1079+takeEndBy = forAll (listOf (chooseInt (0, maxStreamLen))) $ \lst -> monadicIO $ do
1080+ let (s1, s3) = span (<= 200) lst
1081+ let s4 = [head s3 | not (null s3)]
1082+ s2 <- run $ S.toList $ IS.takeEndBy (> 200) $ S.fromList lst
1083+ assert $ s1 ++ s4 == s2
1084+
10771085-- XXX add tests for MonadReader and MonadError etc. In case an SVar is
10781086-- accidentally passed through them.
10791087--
@@ -1120,6 +1128,8 @@ transformCombineOpsCommon constr desc eq t = do
11201128 prop (desc <> " takeWhileM False") $
11211129 transform (takeWhile (const False)) t (S.takeWhileM (const $ return False))
11221130
1131+ prop "takeEndBy" takeEndBy
1132+
11231133 prop (desc <> " drop maxBound") $
11241134 transform (drop maxBound) t (S.drop maxBound)
11251135 prop (desc <> " drop 0") $ transform (drop 0) t (S.drop 0)