on master help sign in
Use rewrite rules to simplify sepcialized code

improved the performance of "drop" operations by 2x

commit25cb5da69bfc3c022630570f68d0e7877d24e269 authorHarendra Kumar <harendra.kumar@gmail.com> dateSat 29 Dec 2018, 00:54 (8 years ago) parent831113b
1 file changed+42−3
src/Streamly/Streams/StreamK/Type.hs+42−3
src/Streamly/Streams/StreamK/Type.hs+42−3
@@ -10,6 +10,8 @@
1010{-# LANGUAGE RankNTypes #-}
1111{-# LANGUAGE UndecidableInstances #-} -- XXX
1212
13+#include "../inline.hs"
14+
1315-- |
1416-- Module : Streamly.Streams.StreamK.Type
1517-- Copyright : (c) 2017 Harendra Kumar
@@ -182,10 +184,13 @@ adapt = fromStream . toStream
182184-- Currently we always use "SVar Stream" and therefore a different State type
183185-- parameterized by that stream.
184186--
187+-- XXX Since t is coercible we should be able to coerce k
188+-- mkStream k = fromStream $ MkStream $ coerce k
189+--
185190-- | Build a stream from an 'SVar', a stop continuation, a singleton stream
186191-- continuation and a yield continuation.
187−{-# INLINE mkStream #-}
188−mkStream:: IsStream t
192+{-# INLINE_EARLY mkStream #-}
193+mkStream :: IsStream t
189194 => (forall r. State Stream m a
190195 -> (a -> t m a -> m r)
191196 -> (a -> m r)
@@ -196,6 +201,26 @@ mkStream k = fromStream $ MkStream $ \st yld sng stp ->
196201 let yieldk a r = yld a (toStream r)
197202 in k st yieldk sng stp
198203
204+{-# RULES "mkStream from stream" mkStream = mkStreamFromStream #-}
205+mkStreamFromStream :: IsStream t
206+ => (forall r. State Stream m a
207+ -> (a -> Stream m a -> m r)
208+ -> (a -> m r)
209+ -> m r
210+ -> m r)
211+ -> t m a
212+mkStreamFromStream k = fromStream $ MkStream k
213+
214+{-# RULES "mkStream stream" mkStream = mkStreamStream #-}
215+mkStreamStream
216+ :: (forall r. State Stream m a
217+ -> (a -> Stream m a -> m r)
218+ -> (a -> m r)
219+ -> m r
220+ -> m r)
221+ -> Stream m a
222+mkStreamStream = MkStream
223+
199224-- | A terminal function that has no continuation to follow.
200225type StopK m = forall r. m r -> m r
201226
@@ -229,7 +254,7 @@ consK k r = mkStream $ \_ yld _ _ -> k (\x -> yld x r)
229254-- | Fold a stream by providing an SVar, a stop continuation, a singleton
230255-- continuation and a yield continuation. The stream would share the current
231256-- SVar passed via the State.
232−{-# INLINE foldStreamShared #-}
257+{-# INLINE_EARLY foldStreamShared #-}
233258foldStreamShared
234259 :: IsStream t
235260 => State Stream m a
@@ -243,6 +268,20 @@ foldStreamShared st yld sng stp m =
243268 MkStream k = toStream m
244269 in k st yieldk sng stp
245270
271+-- XXX write a similar rule for foldStream as well?
272+{-# RULES "foldStreamShared from stream"
273+ foldStreamShared = foldStreamSharedStream #-}
274+foldStreamSharedStream
275+ :: State Stream m a
276+ -> (a -> Stream m a -> m r)
277+ -> (a -> m r)
278+ -> m r
279+ -> Stream m a
280+ -> m r
281+foldStreamSharedStream st yld sng stp m =
282+ let MkStream k = toStream m
283+ in k st yld sng stp
284+
246285-- | Fold a stream by providing a State, stop continuation, a singleton
247286-- continuation and a yield continuation. The stream will not use the SVar
248287-- passed via State.