loop (p `plusPtr` off) (len-1) []
{-# RULES
-"unpack-list" [1] forall p . unpackFoldr p (:) [] = unpackList p
+ "FPS unpack-list" [1] forall p . unpackFoldr p (:) [] = unpackList p
#-}
#endif
{-# RULES
-- v2 fusion
-"length/loop" forall loop s .
+"FPS length/loop" forall loop s .
length (loopArr (loopWrapper loop s)) =
lengthU (loopArr (loopWrapper loop s))
{-# RULES
-"minimum/loop" forall loop s .
+"FPS minimum/loop" forall loop s .
minimum (loopArr (loopWrapper loop s)) =
minimumU (loopArr (loopWrapper loop s))
-"maximum/loop" forall loop s .
+"FPS maximum/loop" forall loop s .
maximum (loopArr (loopWrapper loop s)) =
maximumU (loopArr (loopWrapper loop s))
#if __GLASGOW_HASKELL__ >= 605
{-# RULES
-"FPS specialise filter (== x)" forall x.
- filter (== x) = filterByte x
+ "FPS specialise filter (== x)" forall x.
+ filter (== x) = filterByte x
#-}
#endif
zipWith f ps qs
| null ps || null qs = []
| otherwise = f (unsafeHead ps) (unsafeHead qs) : zipWith f (unsafeTail ps) (unsafeTail qs)
+#if defined(__GLASGOW_HASKELL__)
+{-# INLINE [1] zipWith #-}
+#endif
--
-- | A specialised version of zipWith for the common case of a
"FPS specialise zipWith" forall (f :: Word8 -> Word8 -> Word8) p q .
zipWith f p q = unpack (zipWith' f p q)
+
#-}
-- | /O(n)/ 'unzip' transforms a list of pairs of bytes into a pair of
writeByte p c = ST $ \s# ->
case writeWord8OffAddr# p 0# c s# of s2# -> (# s2#, () #)
{-# INLINE writeByte #-}
+{-# INLINE [1] pack #-}
{-# RULES
-"pack/packAddress" forall s# .
- pack (unpackCString# s#) = B.packAddress s#
+ "FPS pack/packAddress" forall s .
+ pack (unpackCString# s) = B.packAddress s
#-}
#endif
-{-# INLINE pack #-}
-
-- | /O(n)/ Converts a 'ByteString' to a 'String'.
unpack :: ByteString -> [Char]
unpack = P.map w2c . B.unpack
-- | 'dropWhile' @p xs@ returns the suffix remaining after 'takeWhile' @p xs@.
dropWhile :: (Char -> Bool) -> ByteString -> ByteString
dropWhile f = B.dropWhile (f . w2c)
-{-# INLINE dropWhile #-}
+#if defined(__GLASGOW_HASKELL__)
+{-# INLINE [1] dropWhile #-}
+#endif
-- | 'break' @p@ is equivalent to @'span' ('not' . p)@.
break :: (Char -> Bool) -> ByteString -> (ByteString, ByteString)
break f = B.break (f . w2c)
-{-# INLINE break #-}
+#if defined(__GLASGOW_HASKELL__)
+{-# INLINE [1] break #-}
+#endif
-- | 'span' @p xs@ breaks the ByteString into two segments. It is
-- equivalent to @('takeWhile' p xs, 'dropWhile' p xs)@
{-# RULES
-"loop/loop fusion!" forall em1 em2 start1 start2 arr.
+"FPS loop/loop fusion!" forall em1 em2 start1 start2 arr.
loopU em2 start2 (loopArr (loopU em1 start1 arr)) =
loopSndAcc (loopU (em1 `fuseEFL` em2) (start1 :*: start2) arr)
{-# RULES
-"lazy loop/loop fusion!" forall em1 em2 start1 start2 arr.
+"FPS lazy loop/loop fusion!" forall em1 em2 start1 start2 arr.
loopL em2 start2 (loopArr (loopL em1 start1 arr)) =
loopSndAcc (loopL (em1 `fuseEFL` em2) (start1 :*: start2) arr)
{-# RULES
-"loopArr/loopSndAcc" forall x.
+"FPS loopArr/loopSndAcc" forall x.
loopArr (loopSndAcc x) = loopArr x
-"seq/NoAcc" forall (u::NoAcc) e.
+"FPS seq/NoAcc" forall (u::NoAcc) e.
u `seq` e = e
-"loop/loop wrapper elimination" forall loop1 loop2 arr.
+"FPS loop/loop wrapper elimination" forall loop1 loop2 arr.
loopWrapper loop2 (loopArr (loopWrapper loop1 arr)) =
loopSndAcc (loopWrapper (sequenceLoops loop1 loop2) arr)
-- is monadic, so its really n >> m fusion (i.e. m.n), not n . m fusion.
--
-"up/up loop fusion" forall f1 f2 acc1 acc2.
+"FPS up/up loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doUpLoop f1 acc1) (doUpLoop f2 acc2) =
doUpLoop (f1 `fuseAccAccEFL` f2) (acc1 :*: acc2)
-"map/map loop fusion" forall f1 f2 acc1 acc2.
+"FPS map/map loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doMapLoop f1 acc1) (doMapLoop f2 acc2) =
doMapLoop (f1 `fuseMapMapEFL` f2) (acc1 :*: acc2)
-"filter/filter loop fusion" forall f1 f2 acc1 acc2.
+"FPS filter/filter loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doFilterLoop f1 acc1) (doFilterLoop f2 acc2) =
doFilterLoop (f1 `fuseFilterFilterEFL` f2) (acc1 :*: acc2)
-"map/filter loop fusion" forall f1 f2 acc1 acc2.
+"FPS map/filter loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doMapLoop f1 acc1) (doFilterLoop f2 acc2) =
doNoAccLoop (f1 `fuseMapFilterEFL` f2) (acc1 :*: acc2)
-"filter/map loop fusion" forall f1 f2 acc1 acc2.
+"FPS filter/map loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doFilterLoop f1 acc1) (doMapLoop f2 acc2) =
doNoAccLoop (f1 `fuseFilterMapEFL` f2) (acc1 :*: acc2)
-"map/up loop fusion" forall f1 f2 acc1 acc2.
+"FPS map/up loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doMapLoop f1 acc1) (doUpLoop f2 acc2) =
doUpLoop (f1 `fuseMapAccEFL` f2) (acc1 :*: acc2)
-"up/map loop fusion" forall f1 f2 acc1 acc2.
+"FPS up/map loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doUpLoop f1 acc1) (doMapLoop f2 acc2) =
doUpLoop (f1 `fuseAccMapEFL` f2) (acc1 :*: acc2)
-"filter/up loop fusion" forall f1 f2 acc1 acc2.
+"FPS filter/up loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doFilterLoop f1 acc1) (doUpLoop f2 acc2) =
doUpLoop (f1 `fuseFilterAccEFL` f2) (acc1 :*: acc2)
-"up/filter loop fusion" forall f1 f2 acc1 acc2.
+"FPS up/filter loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doUpLoop f1 acc1) (doFilterLoop f2 acc2) =
doUpLoop (f1 `fuseAccFilterEFL` f2) (acc1 :*: acc2)
-"down/down loop fusion" forall f1 f2 acc1 acc2.
+"FPS down/down loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doDownLoop f1 acc1) (doDownLoop f2 acc2) =
doDownLoop (f1 `fuseAccAccEFL` f2) (acc1 :*: acc2)
-"map/down fusion" forall f1 f2 acc1 acc2.
+"FPS map/down fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doMapLoop f1 acc1) (doDownLoop f2 acc2) =
doDownLoop (f1 `fuseMapAccEFL` f2) (acc1 :*: acc2)
-"down/map loop fusion" forall f1 f2 acc1 acc2.
+"FPS down/map loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doDownLoop f1 acc1) (doMapLoop f2 acc2) =
doDownLoop (f1 `fuseAccMapEFL` f2) (acc1 :*: acc2)
-"filter/down fusion" forall f1 f2 acc1 acc2.
+"FPS filter/down fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doFilterLoop f1 acc1) (doDownLoop f2 acc2) =
doDownLoop (f1 `fuseFilterAccEFL` f2) (acc1 :*: acc2)
-"down/filter loop fusion" forall f1 f2 acc1 acc2.
+"FPS down/filter loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doDownLoop f1 acc1) (doFilterLoop f2 acc2) =
doDownLoop (f1 `fuseAccFilterEFL` f2) (acc1 :*: acc2)
-"noAcc/noAcc loop fusion" forall f1 f2 acc1 acc2.
+"FPS noAcc/noAcc loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doNoAccLoop f1 acc1) (doNoAccLoop f2 acc2) =
doNoAccLoop (f1 `fuseNoAccNoAccEFL` f2) (acc1 :*: acc2)
-"noAcc/up loop fusion" forall f1 f2 acc1 acc2.
+"FPS noAcc/up loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doNoAccLoop f1 acc1) (doUpLoop f2 acc2) =
doUpLoop (f1 `fuseNoAccAccEFL` f2) (acc1 :*: acc2)
-"up/noAcc loop fusion" forall f1 f2 acc1 acc2.
+"FPS up/noAcc loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doUpLoop f1 acc1) (doNoAccLoop f2 acc2) =
doUpLoop (f1 `fuseAccNoAccEFL` f2) (acc1 :*: acc2)
-"map/noAcc loop fusion" forall f1 f2 acc1 acc2.
+"FPS map/noAcc loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doMapLoop f1 acc1) (doNoAccLoop f2 acc2) =
doNoAccLoop (f1 `fuseMapNoAccEFL` f2) (acc1 :*: acc2)
-"noAcc/map loop fusion" forall f1 f2 acc1 acc2.
+"FPS noAcc/map loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doNoAccLoop f1 acc1) (doMapLoop f2 acc2) =
doNoAccLoop (f1 `fuseNoAccMapEFL` f2) (acc1 :*: acc2)
-"filter/noAcc loop fusion" forall f1 f2 acc1 acc2.
+"FPS filter/noAcc loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doFilterLoop f1 acc1) (doNoAccLoop f2 acc2) =
doNoAccLoop (f1 `fuseFilterNoAccEFL` f2) (acc1 :*: acc2)
-"noAcc/filter loop fusion" forall f1 f2 acc1 acc2.
+"FPS noAcc/filter loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doNoAccLoop f1 acc1) (doFilterLoop f2 acc2) =
doNoAccLoop (f1 `fuseNoAccFilterEFL` f2) (acc1 :*: acc2)
-"noAcc/down loop fusion" forall f1 f2 acc1 acc2.
+"FPS noAcc/down loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doNoAccLoop f1 acc1) (doDownLoop f2 acc2) =
doDownLoop (f1 `fuseNoAccAccEFL` f2) (acc1 :*: acc2)
-"down/noAcc loop fusion" forall f1 f2 acc1 acc2.
+"FPS down/noAcc loop fusion" forall f1 f2 acc1 acc2.
sequenceLoops (doDownLoop f1 acc1) (doNoAccLoop f2 acc2) =
doDownLoop (f1 `fuseAccNoAccEFL` f2) (acc1 :*: acc2)