{-# LANGUAGE LambdaCase #-}
module Data.Fmt.ByteString.Lazy (
toChunks,
fromChunks,
toNuChunks,
foldChunks,
unfoldChunks,
refoldChunks,
mapChunks,
streamChunks,
transformChunks,
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Internal as BLI
import Data.Functor.Fixed (Mu, Nu (..), unwrap, Algebra, Coalgebra)
import Data.Functor.Foldable (fold, unfold, refold, comap)
import Data.Functor.Pattern (Cons (..))
toChunks :: BL.ByteString -> Mu (Cons ByteString)
toChunks :: ByteString -> Mu (Cons ByteString)
toChunks = Coalgebra (Cons ByteString) ByteString
-> ByteString -> Mu (Cons ByteString)
forall (f :: * -> *) a. Functor f => Coalgebra f a -> a -> Mu f
unfold Coalgebra (Cons ByteString) ByteString
coalg
where
coalg :: Coalgebra (Cons ByteString) ByteString
coalg ByteString
lbs = case ByteString
lbs of
ByteString
BLI.Empty -> Cons ByteString ByteString
forall a b. Cons a b
Nil
BLI.Chunk ByteString
c ByteString
rest -> ByteString -> Coalgebra (Cons ByteString) ByteString
forall a b. a -> b -> Cons a b
Cons ByteString
c ByteString
rest
fromChunks :: Mu (Cons ByteString) -> BL.ByteString
fromChunks :: Mu (Cons ByteString) -> ByteString
fromChunks = Algebra (Cons ByteString) ByteString
-> Mu (Cons ByteString) -> ByteString
forall (f :: * -> *) a. Algebra f a -> Mu f -> a
fold Algebra (Cons ByteString) ByteString
alg
where
alg :: Algebra (Cons ByteString) ByteString
alg Cons ByteString ByteString
Nil = ByteString
BL.empty
alg (Cons ByteString
c ByteString
rest) = ByteString -> ByteString -> ByteString
BLI.Chunk ByteString
c ByteString
rest
toNuChunks :: BL.ByteString -> Nu (Cons ByteString)
toNuChunks :: ByteString -> Nu (Cons ByteString)
toNuChunks = Coalgebra (Cons ByteString) ByteString
-> ByteString -> Nu (Cons ByteString)
forall (f :: * -> *) a. (a -> f a) -> a -> Nu f
Nu Coalgebra (Cons ByteString) ByteString
coalg
where
coalg :: Coalgebra (Cons ByteString) ByteString
coalg ByteString
lbs = case ByteString
lbs of
ByteString
BLI.Empty -> Cons ByteString ByteString
forall a b. Cons a b
Nil
BLI.Chunk ByteString
c ByteString
rest -> ByteString -> Coalgebra (Cons ByteString) ByteString
forall a b. a -> b -> Cons a b
Cons ByteString
c ByteString
rest
foldChunks :: Algebra (Cons ByteString) a -> BL.ByteString -> a
foldChunks :: forall a. Algebra (Cons ByteString) a -> ByteString -> a
foldChunks Algebra (Cons ByteString) a
alg = Algebra (Cons ByteString) a -> Mu (Cons ByteString) -> a
forall (f :: * -> *) a. Algebra f a -> Mu f -> a
fold Algebra (Cons ByteString) a
alg (Mu (Cons ByteString) -> a)
-> (ByteString -> Mu (Cons ByteString)) -> ByteString -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Mu (Cons ByteString)
toChunks
unfoldChunks :: Coalgebra (Cons ByteString) a -> a -> BL.ByteString
unfoldChunks :: forall a. Coalgebra (Cons ByteString) a -> a -> ByteString
unfoldChunks Coalgebra (Cons ByteString) a
coalg = Mu (Cons ByteString) -> ByteString
fromChunks (Mu (Cons ByteString) -> ByteString)
-> (a -> Mu (Cons ByteString)) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Coalgebra (Cons ByteString) a -> a -> Mu (Cons ByteString)
forall (f :: * -> *) a. Functor f => Coalgebra f a -> a -> Mu f
unfold Coalgebra (Cons ByteString) a
coalg
refoldChunks :: Algebra (Cons ByteString) b -> Coalgebra (Cons ByteString) a -> a -> b
refoldChunks :: forall b a.
Algebra (Cons ByteString) b
-> Coalgebra (Cons ByteString) a -> a -> b
refoldChunks = Algebra (Cons ByteString) b
-> Coalgebra (Cons ByteString) a -> a -> b
forall (f :: * -> *) b a.
Functor f =>
Algebra f b -> Coalgebra f a -> a -> b
refold
mapChunks :: (ByteString -> ByteString) -> BL.ByteString -> BL.ByteString
mapChunks :: (ByteString -> ByteString) -> ByteString -> ByteString
mapChunks ByteString -> ByteString
f = Mu (Cons ByteString) -> ByteString
fromChunks (Mu (Cons ByteString) -> ByteString)
-> (ByteString -> Mu (Cons ByteString)) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString -> ByteString)
-> Mu (Cons ByteString) -> Mu (Cons ByteString)
forall (f :: * -> * -> *) a b.
(Bifunctor f, Functor (f a), Functor (f b)) =>
(a -> b) -> Mu (f a) -> Mu (f b)
comap ByteString -> ByteString
f (Mu (Cons ByteString) -> Mu (Cons ByteString))
-> (ByteString -> Mu (Cons ByteString))
-> ByteString
-> Mu (Cons ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Mu (Cons ByteString)
toChunks
streamChunks
:: (Mu (Cons ByteString) -> Mu (Cons ByteString))
-> BL.ByteString -> BL.ByteString
streamChunks :: (Mu (Cons ByteString) -> Mu (Cons ByteString))
-> ByteString -> ByteString
streamChunks Mu (Cons ByteString) -> Mu (Cons ByteString)
f = Mu (Cons ByteString) -> ByteString
fromChunks (Mu (Cons ByteString) -> ByteString)
-> (ByteString -> Mu (Cons ByteString)) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mu (Cons ByteString) -> Mu (Cons ByteString)
f (Mu (Cons ByteString) -> Mu (Cons ByteString))
-> (ByteString -> Mu (Cons ByteString))
-> ByteString
-> Mu (Cons ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Mu (Cons ByteString)
toChunks
transformChunks
:: (Mu (Cons ByteString) -> Mu (Cons a))
-> BL.ByteString -> [a]
transformChunks :: forall a.
(Mu (Cons ByteString) -> Mu (Cons a)) -> ByteString -> [a]
transformChunks Mu (Cons ByteString) -> Mu (Cons a)
f = Cons a (Mu (Cons a)) -> [a]
forall {a}. Cons a (Mu (Cons a)) -> [a]
go (Cons a (Mu (Cons a)) -> [a])
-> (ByteString -> Cons a (Mu (Cons a))) -> ByteString -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mu (Cons a) -> Cons a (Mu (Cons a))
forall (f :: * -> *). Functor f => Mu f -> f (Mu f)
unwrap (Mu (Cons a) -> Cons a (Mu (Cons a)))
-> (ByteString -> Mu (Cons a))
-> ByteString
-> Cons a (Mu (Cons a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mu (Cons ByteString) -> Mu (Cons a)
f (Mu (Cons ByteString) -> Mu (Cons a))
-> (ByteString -> Mu (Cons ByteString))
-> ByteString
-> Mu (Cons a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Mu (Cons ByteString)
toChunks
where
go :: Cons a (Mu (Cons a)) -> [a]
go Cons a (Mu (Cons a))
Nil = []
go (Cons a
a Mu (Cons a)
rest) = a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: Cons a (Mu (Cons a)) -> [a]
go (Mu (Cons a) -> Cons a (Mu (Cons a))
forall (f :: * -> *). Functor f => Mu f -> f (Mu f)
unwrap Mu (Cons a)
rest)