module Data.CompactString.Fusion
( loopAcc, loopArr, NoAcc(..)
, foldEFL, mapEFL, filterEFL, scanEFL, mapAccumEFL, mapIndexEFL
, loopUp, loopUpC, loopDown, loopUpFold, loopDownFold
) where
import Data.CompactString.Internal
import qualified Data.ByteString.Internal as B
data NoAcc = NoAcc
loopArr :: (PairS acc arr) -> arr
loopArr (_ :*: arr) = arr
#if defined(__GLASGOW_HASKELL__)
#endif
loopAcc :: (PairS acc arr) -> acc
loopAcc (acc :*: _) = acc
#if defined(__GLASGOW_HASKELL__)
#endif
mapEFL :: (Char -> Char) -> AccEFL NoAcc
mapEFL f = \_ e -> (NoAcc :*: (JustS $ f e))
foldEFL :: (acc -> Char -> acc) -> AccEFL acc
foldEFL f = \a e -> (f a e :*: NothingS)
filterEFL :: (Char -> Bool) -> AccEFL NoAcc
filterEFL p = \_ e -> if p e then (NoAcc :*: JustS e)
else (NoAcc :*: NothingS)
scanEFL :: (Char -> Char -> Char) -> AccEFL Char
scanEFL f = \a e -> (f a e :*: JustS a)
mapAccumEFL :: (acc -> Char -> (acc, Char)) -> AccEFL acc
mapAccumEFL f = \a e -> case f a e of (a', e') -> (a' :*: JustS e')
mapIndexEFL :: (Int -> Char -> Char) -> AccEFL Int
mapIndexEFL f = \i e -> let i' = i+1 in i' `seq` (i' :*: JustS (f i e))
#if defined(__GLASGOW_HASKELL__)
#endif
loopUp :: Encoding a => AccEFL acc -> acc -> CompactString a -> PairS acc (CompactString a)
loopUp f a arr = loopWrapper (newSize (encoding arr)) (doUpLoop (encoding arr) f a) arr
loopUpC :: Encoding a => AccEFL acc -> acc -> CompactString a -> PairS acc (CompactString a)
loopUpC f a arr = loopWrapper id (doUpLoop (encoding arr) f a) arr
loopDown :: Encoding a => AccEFL acc -> acc -> CompactString a -> PairS acc (CompactString a)
loopDown f a arr = loopWrapper (newSize (encoding arr)) (doDownLoop (encoding arr) f a) arr
loopUpFold :: Encoding a => FoldEFL acc -> acc -> CompactString a -> acc
loopUpFold f a arr = loopWrapperFold (doUpLoopFold (encoding arr) f a) arr
loopDownFold :: Encoding a => FoldEFL acc -> acc -> CompactString a -> acc
loopDownFold f a arr = loopWrapperFold (doDownLoopFold (encoding arr) f a) arr
loopWrapper :: (Int -> Int) -> ImperativeLoop acc -> CompactString a -> PairS acc (CompactString a)
loopWrapper factor body cs@(CS (B.PS _ _ srcLen)) = unsafeWithBuffer cs $ \src -> do
(ps, acc) <- B.createAndTrim' (factor srcLen) $ \dest -> do
(acc :*: destOffset :*: destLen) <- body src dest srcLen
return (destOffset, destLen, acc)
return (acc :*: CS ps)
loopWrapperFold :: ImperativeLoop_ acc -> CompactString a -> acc
loopWrapperFold body cs@(CS (B.PS _ _ srcLen)) = unsafeWithBuffer cs $ \src -> body src srcLen