on master help sign in
Simplify the "take" fold
7b36017Harendra Kumar
src/Streamly/Internal/Data/Fold/Type.hs+10−15
@@ -1093,25 +1093,20 @@ take n (Fold fstep finitial fextract) = Fold step initial extract
1093
1093
1094 where
1094 where
1095
1095
1096− initial = do
1096+ {-# INLINE next #-}
1097− res <- finitial
1097+ next i res =
1098− case res of
1099− Partial s ->
1100− if n > 0
1101− then return $ Partial $ Tuple'Fused 0 s
1102− else Done <$> fextract s
1103− Done b -> return $ Done b
1104−
1105− step (Tuple'Fused i r) a = do
1106− res <- fstep r a
1107 case res of
1098 case res of
1108− Partial sres -> do
1099+ Partial s -> do
1109 let i1 = i + 1
1100 let i1 = i + 1
1110− s1 = Tuple'Fused i1 sres
1101+ s1 = Tuple'Fused i1 s
1111 if i1 < n
1102 if i1 < n
1112 then return $ Partial s1
1103 then return $ Partial s1
1113− else Done <$> fextract sres
1104+ else Done <$> fextract s
1114− Done bres -> return $ Done bres
1105+ Done b -> return $ Done b
1106+
1107+ initial = finitial >>= next (-1)
1108+
1109+ step (Tuple'Fused i r) a = fstep r a >>= next i
1115
1110
1116 extract (Tuple'Fused _ r) = fextract r
1111 extract (Tuple'Fused _ r) = fextract r
1117
1112