module Streamly.Internal.Unicode.Stream
(
decodeLatin1
, decodeUtf8
, decodeUtf8'
, decodeUtf8_
, DecodeError(..)
, DecodeState
, CodePoint
, decodeUtf8Either
, resumeDecodeUtf8Either
, decodeUtf8Arrays
, decodeUtf8Arrays'
, decodeUtf8Arrays_
, encodeLatin1
, encodeLatin1'
, encodeLatin1_
, encodeUtf8
, encodeUtf8'
, encodeUtf8_
, encodeStrings
, stripHead
, lines
, words
, unlines
, unwords
, decodeUtf8D
, decodeUtf8D'
, decodeUtf8D_
, encodeUtf8D
, encodeUtf8D'
, encodeUtf8D_
, decodeUtf8EitherD
, resumeDecodeUtf8EitherD
, decodeUtf8ArraysD
, decodeUtf8ArraysD'
, decodeUtf8ArraysD_
, decodeUtf8Lax
, encodeLatin1Lax
, encodeUtf8Lax
)
where
#include "inline.hs"
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.Bits (shiftR, shiftL, (.|.), (.&.))
import Data.Char (chr, ord)
import Data.Word (Word8)
import Foreign.Storable (Storable(..))
import Fusion.Plugin.Types (Fuse(..))
import GHC.Base (assert, unsafeChr)
import GHC.IO.Encoding.Failure (isSurrogate)
import GHC.Ptr (Ptr (..), plusPtr)
import System.IO.Unsafe (unsafePerformIO)
import Streamly.Internal.Data.Array.Foreign (Array)
import Streamly.Internal.Data.Array.Foreign.Mut.Type (ArrayContents, touch)
import Streamly.Internal.Data.Fold (Fold)
import Streamly.Internal.Data.Stream.IsStream.Type
(IsStream, fromStreamD, toStreamD, adapt)
import Streamly.Internal.Data.Stream.Serial (SerialT)
import Streamly.Internal.Data.Stream.StreamD (Stream(..), Step (..))
import Streamly.Internal.Data.SVar (adaptState)
import Streamly.Internal.Data.Tuple.Strict (Tuple'(..))
import Streamly.Internal.Data.Unfold (Unfold)
import Streamly.Internal.System.IO (unsafeInlineIO)
import qualified Streamly.Internal.Data.Unfold as Unfold
import qualified Streamly.Internal.Data.Stream.Serial as Serial
import qualified Streamly.Internal.Data.Array.Foreign as Array
import qualified Streamly.Internal.Data.Array.Foreign.Type as A
import qualified Streamly.Internal.Data.Stream.IsStream as S
import qualified Streamly.Internal.Data.Stream.StreamD as D
import Prelude hiding (lines, words, unlines, unwords)
{-# INLINE decodeLatin1 #-}
decodeLatin1 :: (IsStream t, Monad m) => t m Word8 -> t m Char
decodeLatin1 :: t m Word8 -> t m Char
decodeLatin1 = (Word8 -> Char) -> t m Word8 -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(IsStream t, Monad m) =>
(a -> b) -> t m a -> t m b
S.map (Int -> Char
unsafeChr (Int -> Char) -> (Word8 -> Int) -> Word8 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral)
{-# INLINE encodeLatin1' #-}
encodeLatin1' :: (IsStream t, Monad m) => t m Char -> t m Word8
encodeLatin1' :: t m Char -> t m Word8
encodeLatin1' = (Char -> Word8) -> t m Char -> t m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(IsStream t, Monad m) =>
(a -> b) -> t m a -> t m b
S.map Char -> Word8
forall p. Num p => Char -> p
convert
where
convert :: Char -> p
convert Char
c =
let codepoint :: Int
codepoint = Char -> Int
ord Char
c
in if Int
codepoint Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
255
then [Char] -> p
forall a. HasCallStack => [Char] -> a
error ([Char] -> p) -> [Char] -> p
forall a b. (a -> b) -> a -> b
$ [Char]
"Streamly.Unicode.encodeLatin1 invalid " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
[Char]
"input char codepoint " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
codepoint
else Int -> p
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
codepoint
{-# INLINE encodeLatin1 #-}
encodeLatin1 :: (IsStream t, Monad m) => t m Char -> t m Word8
encodeLatin1 :: t m Char -> t m Word8
encodeLatin1 = (Char -> Word8) -> t m Char -> t m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(IsStream t, Monad m) =>
(a -> b) -> t m a -> t m b
S.map (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> (Char -> Int) -> Char -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ord)
{-# INLINE encodeLatin1_ #-}
encodeLatin1_ :: (IsStream t, Monad m) => t m Char -> t m Word8
encodeLatin1_ :: t m Char -> t m Word8
encodeLatin1_ = (Char -> Word8) -> t m Char -> t m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(IsStream t, Monad m) =>
(a -> b) -> t m a -> t m b
S.map (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> (Char -> Int) -> Char -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ord) (t m Char -> t m Word8)
-> (t m Char -> t m Char) -> t m Char -> t m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> t m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
(a -> Bool) -> t m a -> t m a
S.filter (Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
255)
{-# DEPRECATED encodeLatin1Lax "Please use 'encodeLatin1' instead" #-}
{-# INLINE encodeLatin1Lax #-}
encodeLatin1Lax :: (IsStream t, Monad m) => t m Char -> t m Word8
encodeLatin1Lax :: t m Char -> t m Word8
encodeLatin1Lax = t m Char -> t m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *).
(IsStream t, Monad m) =>
t m Char -> t m Word8
encodeLatin1
type CodePoint = Int
type DecodeState = Word8
data DecodeError = DecodeError !DecodeState !CodePoint deriving Int -> DecodeError -> [Char] -> [Char]
[DecodeError] -> [Char] -> [Char]
DecodeError -> [Char]
(Int -> DecodeError -> [Char] -> [Char])
-> (DecodeError -> [Char])
-> ([DecodeError] -> [Char] -> [Char])
-> Show DecodeError
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
showList :: [DecodeError] -> [Char] -> [Char]
$cshowList :: [DecodeError] -> [Char] -> [Char]
show :: DecodeError -> [Char]
$cshow :: DecodeError -> [Char]
showsPrec :: Int -> DecodeError -> [Char] -> [Char]
$cshowsPrec :: Int -> DecodeError -> [Char] -> [Char]
Show
decodeTable :: [Word8]
decodeTable :: [Word8]
decodeTable = [
Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0, Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,
Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0, Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,
Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0, Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,
Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0, Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,Word8
0,
Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1,Word8
1, Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,Word8
9,
Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7, Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,Word8
7,
Word8
8,Word8
8,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2, Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,Word8
2,
Word8
10,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
3,Word8
4,Word8
3,Word8
3, Word8
11,Word8
6,Word8
6,Word8
6,Word8
5,Word8
8,Word8
8,Word8
8,Word8
8,Word8
8,Word8
8,Word8
8,Word8
8,Word8
8,Word8
8,Word8
8,
Word8
0,Word8
12,Word8
24,Word8
36,Word8
60,Word8
96,Word8
84,Word8
12,Word8
12,Word8
12,Word8
48,Word8
72, Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,
Word8
12, Word8
0,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12, Word8
0,Word8
12, Word8
0,Word8
12,Word8
12, Word8
12,Word8
24,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
24,Word8
12,Word8
24,Word8
12,Word8
12,
Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
24,Word8
12,Word8
12,Word8
12,Word8
12, Word8
12,Word8
24,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
24,Word8
12,Word8
12,
Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
36,Word8
12,Word8
36,Word8
12,Word8
12, Word8
12,Word8
36,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
36,Word8
12,Word8
36,Word8
12,Word8
12,
Word8
12,Word8
36,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12,Word8
12
]
{-# NOINLINE utf8d #-}
utf8d :: A.Array Word8
utf8d :: Array Word8
utf8d =
IO (Array Word8) -> Array Word8
forall a. IO a -> a
unsafePerformIO
(IO (Array Word8) -> Array Word8)
-> IO (Array Word8) -> Array Word8
forall a b. (a -> b) -> a -> b
$ Fold IO Word8 (Array Word8) -> Stream IO Word8 -> IO (Array Word8)
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Stream m a -> m b
D.fold (Int -> Int -> Fold IO Word8 (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, Storable a) =>
Int -> Int -> Fold m a (Array a)
A.writeNAlignedUnmanaged Int
64 ([Word8] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Word8]
decodeTable))
([Word8] -> Stream IO Word8
forall (m :: * -> *) a. Applicative m => [a] -> Stream m a
D.fromList [Word8]
decodeTable)
{-# INLINE_NORMAL unsafePeekElemOff #-}
unsafePeekElemOff :: forall a. Storable a => Ptr a -> Int -> a
unsafePeekElemOff :: Ptr a -> Int -> a
unsafePeekElemOff Ptr a
p Int
i = let !x :: a
x = IO a -> a
forall a. IO a -> a
unsafeInlineIO (IO a -> a) -> IO a -> a
forall a b. (a -> b) -> a -> b
$ Ptr a -> Int -> IO a
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr a
p Int
i in a
x
{-# INLINE decode0 #-}
decode0 :: Ptr Word8 -> Word8 -> Tuple' DecodeState CodePoint
decode0 :: Ptr Word8 -> Word8 -> Tuple' Word8 Int
decode0 Ptr Word8
table Word8
byte =
let !t :: Word8
t = Ptr Word8
table Ptr Word8 -> Int -> Word8
forall a. Storable a => Ptr a -> Int -> a
`unsafePeekElemOff` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte
!codep' :: Int
codep' = (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
t) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte
!state' :: Word8
state' = Ptr Word8
table Ptr Word8 -> Int -> Word8
forall a. Storable a => Ptr a -> Int -> a
`unsafePeekElemOff` (Int
256 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
t)
in Bool -> Tuple' Word8 Int -> Tuple' Word8 Int
forall a. HasCallStack => Bool -> a -> a
assert ((Word8
byte Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
> Word8
0x7f Bool -> Bool -> Bool
|| [Char] -> Bool
forall a. HasCallStack => [Char] -> a
error [Char]
showByte)
Bool -> Bool -> Bool
&& (Word8
state' Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0 Bool -> Bool -> Bool
|| [Char] -> Bool
forall a. HasCallStack => [Char] -> a
error ([Char]
showByte [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
showTable)))
(Word8 -> Int -> Tuple' Word8 Int
forall a b. a -> b -> Tuple' a b
Tuple' Word8
state' Int
codep')
where
utf8table :: Array Word8
utf8table =
let end :: Ptr b
end = Ptr Word8
table Ptr Word8 -> Int -> Ptr b
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
364
in ArrayContents -> Ptr Word8 -> Ptr Word8 -> Array Word8
forall a. ArrayContents -> Ptr a -> Ptr a -> Array a
A.Array ArrayContents
forall a. HasCallStack => a
undefined Ptr Word8
table Ptr Word8
forall b. Ptr b
end :: A.Array Word8
showByte :: [Char]
showByte = [Char]
"Streamly: decode0: byte: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word8 -> [Char]
forall a. Show a => a -> [Char]
show Word8
byte
showTable :: [Char]
showTable = [Char]
" table: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Array Word8 -> [Char]
forall a. Show a => a -> [Char]
show Array Word8
utf8table
{-# INLINE decode1 #-}
decode1
:: Ptr Word8
-> DecodeState
-> CodePoint
-> Word8
-> Tuple' DecodeState CodePoint
decode1 :: Ptr Word8 -> Word8 -> Int -> Word8 -> Tuple' Word8 Int
decode1 Ptr Word8
table Word8
state Int
codep Word8
byte =
let !t :: Word8
t = Ptr Word8
table Ptr Word8 -> Int -> Word8
forall a. Storable a => Ptr a -> Int -> a
`unsafePeekElemOff` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte
!codep' :: Int
codep' = (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
byte Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3f) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. (Int
codep Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftL` Int
6)
!state' :: Word8
state' = Ptr Word8
table Ptr Word8 -> Int -> Word8
forall a. Storable a => Ptr a -> Int -> a
`unsafePeekElemOff`
(Int
256 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
state Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
t)
in Bool -> Tuple' Word8 Int -> Tuple' Word8 Int
forall a. HasCallStack => Bool -> a -> a
assert (Int
codep' Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0x10FFFF
Bool -> Bool -> Bool
|| [Char] -> Bool
forall a. HasCallStack => [Char] -> a
error ([Char]
showByte [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word8 -> Int -> [Char]
forall a a. (Show a, Show a) => a -> a -> [Char]
showState Word8
state Int
codep))
(Word8 -> Int -> Tuple' Word8 Int
forall a b. a -> b -> Tuple' a b
Tuple' Word8
state' Int
codep')
where
utf8table :: Array Word8
utf8table =
let end :: Ptr b
end = Ptr Word8
table Ptr Word8 -> Int -> Ptr b
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
364
in ArrayContents -> Ptr Word8 -> Ptr Word8 -> Array Word8
forall a. ArrayContents -> Ptr a -> Ptr a -> Array a
A.Array ArrayContents
forall a. HasCallStack => a
undefined Ptr Word8
table Ptr Word8
forall b. Ptr b
end :: A.Array Word8
showByte :: [Char]
showByte = [Char]
"Streamly: decode1: byte: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word8 -> [Char]
forall a. Show a => a -> [Char]
show Word8
byte
showState :: a -> a -> [Char]
showState a
st a
cp =
[Char]
" state: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ a -> [Char]
forall a. Show a => a -> [Char]
show a
st [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
[Char]
" codepoint: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ a -> [Char]
forall a. Show a => a -> [Char]
show a
cp [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
[Char]
" table: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Array Word8 -> [Char]
forall a. Show a => a -> [Char]
show Array Word8
utf8table
#ifndef __GHCJS__
{-# ANN type UTF8DecodeState Fuse #-}
#endif
data UTF8DecodeState s a
= UTF8DecodeInit s
| UTF8DecodeInit1 s Word8
| UTF8DecodeFirst s Word8
| UTF8Decoding s !DecodeState !CodePoint
| YieldAndContinue a (UTF8DecodeState s a)
| Done
{-# INLINE_NORMAL resumeDecodeUtf8EitherD #-}
resumeDecodeUtf8EitherD
:: Monad m
=> DecodeState
-> CodePoint
-> Stream m Word8
-> Stream m (Either DecodeError Char)
resumeDecodeUtf8EitherD :: Word8
-> Int -> Stream m Word8 -> Stream m (Either DecodeError Char)
resumeDecodeUtf8EitherD Word8
dst Int
codep (Stream State Stream m Word8 -> s -> m (Step s Word8)
step s
state) =
let A.Array ArrayContents
_ Ptr Word8
p Ptr Word8
_ = Array Word8
utf8d
!ptr :: Ptr Word8
ptr = Ptr Word8
p
stt :: UTF8DecodeState s a
stt =
if Word8
dst Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
0
then s -> UTF8DecodeState s a
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
state
else s -> Word8 -> Int -> UTF8DecodeState s a
forall s a. s -> Word8 -> Int -> UTF8DecodeState s a
UTF8Decoding s
state Word8
dst Int
codep
in (State Stream m (Either DecodeError Char)
-> UTF8DecodeState s (Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> UTF8DecodeState s (Either DecodeError Char)
-> Stream m (Either DecodeError Char)
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream (Ptr Word8
-> State Stream m (Either DecodeError Char)
-> UTF8DecodeState s (Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a.
Ptr Word8
-> State Stream m a
-> UTF8DecodeState s (Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
step' Ptr Word8
ptr) UTF8DecodeState s (Either DecodeError Char)
forall a. UTF8DecodeState s a
stt
where
{-# INLINE_LATE step' #-}
step' :: Ptr Word8
-> State Stream m a
-> UTF8DecodeState s (Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
step' Ptr Word8
_ State Stream m a
gst (UTF8DecodeInit s
st) = do
Step s Word8
r <- State Stream m Word8 -> s -> m (Step s Word8)
step (State Stream m a -> State Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$ case Step s Word8
r of
Yield Word8
x s
s -> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (s -> Word8 -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> Word8 -> UTF8DecodeState s a
UTF8DecodeInit1 s
s Word8
x)
Skip s
s -> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (s -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
s)
Step s Word8
Stop -> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip UTF8DecodeState s (Either DecodeError Char)
forall s a. UTF8DecodeState s a
Done
step' Ptr Word8
_ State Stream m a
_ (UTF8DecodeInit1 s
st Word8
x) = do
case Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
> Word8
0x7f of
Bool
False ->
Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$ UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
-> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall a b. (a -> b) -> a -> b
$ Either DecodeError Char
-> UTF8DecodeState s (Either DecodeError Char)
-> UTF8DecodeState s (Either DecodeError Char)
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue
(Char -> Either DecodeError Char
forall a b. b -> Either a b
Right (Char -> Either DecodeError Char)
-> Char -> Either DecodeError Char
forall a b. (a -> b) -> a -> b
$ Int -> Char
unsafeChr (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x))
(s -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
st)
Bool
True -> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$ UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
-> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall a b. (a -> b) -> a -> b
$ s -> Word8 -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> Word8 -> UTF8DecodeState s a
UTF8DecodeFirst s
st Word8
x
step' Ptr Word8
table State Stream m a
_ (UTF8DecodeFirst s
st Word8
x) = do
let (Tuple' Word8
sv Int
cp) = Ptr Word8 -> Word8 -> Tuple' Word8 Int
decode0 Ptr Word8
table Word8
x
Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$
case Word8
sv of
Word8
12 ->
UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
-> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall a b. (a -> b) -> a -> b
$ Either DecodeError Char
-> UTF8DecodeState s (Either DecodeError Char)
-> UTF8DecodeState s (Either DecodeError Char)
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue (DecodeError -> Either DecodeError Char
forall a b. a -> Either a b
Left (DecodeError -> Either DecodeError Char)
-> DecodeError -> Either DecodeError Char
forall a b. (a -> b) -> a -> b
$ Word8 -> Int -> DecodeError
DecodeError Word8
0 (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x))
(s -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
st)
Word8
0 -> [Char]
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall a. HasCallStack => [Char] -> a
error [Char]
"unreachable state"
Word8
_ -> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (s -> Word8 -> Int -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> Word8 -> Int -> UTF8DecodeState s a
UTF8Decoding s
st Word8
sv Int
cp)
step' Ptr Word8
table State Stream m a
gst (UTF8Decoding s
st Word8
statePtr Int
codepointPtr) = do
Step s Word8
r <- State Stream m Word8 -> s -> m (Step s Word8)
step (State Stream m a -> State Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s Word8
r of
Yield Word8
x s
s -> do
let (Tuple' Word8
sv Int
cp) = Ptr Word8 -> Word8 -> Int -> Word8 -> Tuple' Word8 Int
decode1 Ptr Word8
table Word8
statePtr Int
codepointPtr Word8
x
Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$
case Word8
sv of
Word8
0 -> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
-> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall a b. (a -> b) -> a -> b
$ Either DecodeError Char
-> UTF8DecodeState s (Either DecodeError Char)
-> UTF8DecodeState s (Either DecodeError Char)
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue (Char -> Either DecodeError Char
forall a b. b -> Either a b
Right (Char -> Either DecodeError Char)
-> Char -> Either DecodeError Char
forall a b. (a -> b) -> a -> b
$ Int -> Char
unsafeChr Int
cp)
(s -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
s)
Word8
12 ->
UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
-> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall a b. (a -> b) -> a -> b
$ Either DecodeError Char
-> UTF8DecodeState s (Either DecodeError Char)
-> UTF8DecodeState s (Either DecodeError Char)
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue (DecodeError -> Either DecodeError Char
forall a b. a -> Either a b
Left (DecodeError -> Either DecodeError Char)
-> DecodeError -> Either DecodeError Char
forall a b. (a -> b) -> a -> b
$ Word8 -> Int -> DecodeError
DecodeError Word8
statePtr Int
codepointPtr)
(s -> Word8 -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> Word8 -> UTF8DecodeState s a
UTF8DecodeInit1 s
s Word8
x)
Word8
_ -> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (s -> Word8 -> Int -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> Word8 -> Int -> UTF8DecodeState s a
UTF8Decoding s
s Word8
sv Int
cp)
Skip s
s -> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$ UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (s -> Word8 -> Int -> UTF8DecodeState s (Either DecodeError Char)
forall s a. s -> Word8 -> Int -> UTF8DecodeState s a
UTF8Decoding s
s Word8
statePtr Int
codepointPtr)
Step s Word8
Stop -> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$ UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. s -> Step s a
Skip (UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
-> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall a b. (a -> b) -> a -> b
$ Either DecodeError Char
-> UTF8DecodeState s (Either DecodeError Char)
-> UTF8DecodeState s (Either DecodeError Char)
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue (DecodeError -> Either DecodeError Char
forall a b. a -> Either a b
Left (DecodeError -> Either DecodeError Char)
-> DecodeError -> Either DecodeError Char
forall a b. (a -> b) -> a -> b
$ Word8 -> Int -> DecodeError
DecodeError Word8
statePtr Int
codepointPtr) UTF8DecodeState s (Either DecodeError Char)
forall s a. UTF8DecodeState s a
Done
step' Ptr Word8
_ State Stream m a
_ (YieldAndContinue Either DecodeError Char
c UTF8DecodeState s (Either DecodeError Char)
s) = Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)))
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall a b. (a -> b) -> a -> b
$ Either DecodeError Char
-> UTF8DecodeState s (Either DecodeError Char)
-> Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. a -> s -> Step s a
Yield Either DecodeError Char
c UTF8DecodeState s (Either DecodeError Char)
s
step' Ptr Word8
_ State Stream m a
_ UTF8DecodeState s (Either DecodeError Char)
Done = Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
-> m (Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char))
forall (m :: * -> *) a. Monad m => a -> m a
return Step
(UTF8DecodeState s (Either DecodeError Char))
(Either DecodeError Char)
forall s a. Step s a
Stop
{-# INLINE_NORMAL decodeUtf8EitherD #-}
decodeUtf8EitherD :: Monad m
=> Stream m Word8 -> Stream m (Either DecodeError Char)
decodeUtf8EitherD :: Stream m Word8 -> Stream m (Either DecodeError Char)
decodeUtf8EitherD = Word8
-> Int -> Stream m Word8 -> Stream m (Either DecodeError Char)
forall (m :: * -> *).
Monad m =>
Word8
-> Int -> Stream m Word8 -> Stream m (Either DecodeError Char)
resumeDecodeUtf8EitherD Word8
0 Int
0
{-# INLINE decodeUtf8Either #-}
decodeUtf8Either :: (Monad m, IsStream t)
=> t m Word8 -> t m (Either DecodeError Char)
decodeUtf8Either :: t m Word8 -> t m (Either DecodeError Char)
decodeUtf8Either = Stream m (Either DecodeError Char) -> t m (Either DecodeError Char)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m (Either DecodeError Char)
-> t m (Either DecodeError Char))
-> (t m Word8 -> Stream m (Either DecodeError Char))
-> t m Word8
-> t m (Either DecodeError Char)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m Word8 -> Stream m (Either DecodeError Char)
forall (m :: * -> *).
Monad m =>
Stream m Word8 -> Stream m (Either DecodeError Char)
decodeUtf8EitherD (Stream m Word8 -> Stream m (Either DecodeError Char))
-> (t m Word8 -> Stream m Word8)
-> t m Word8
-> Stream m (Either DecodeError Char)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Word8 -> Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# INLINE resumeDecodeUtf8Either #-}
resumeDecodeUtf8Either
:: (Monad m, IsStream t)
=> DecodeState
-> CodePoint
-> t m Word8
-> t m (Either DecodeError Char)
resumeDecodeUtf8Either :: Word8 -> Int -> t m Word8 -> t m (Either DecodeError Char)
resumeDecodeUtf8Either Word8
st Int
cp =
Stream m (Either DecodeError Char) -> t m (Either DecodeError Char)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m (Either DecodeError Char)
-> t m (Either DecodeError Char))
-> (t m Word8 -> Stream m (Either DecodeError Char))
-> t m Word8
-> t m (Either DecodeError Char)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8
-> Int -> Stream m Word8 -> Stream m (Either DecodeError Char)
forall (m :: * -> *).
Monad m =>
Word8
-> Int -> Stream m Word8 -> Stream m (Either DecodeError Char)
resumeDecodeUtf8EitherD Word8
st Int
cp (Stream m Word8 -> Stream m (Either DecodeError Char))
-> (t m Word8 -> Stream m Word8)
-> t m Word8
-> Stream m (Either DecodeError Char)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Word8 -> Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
data CodingFailureMode
= TransliterateCodingFailure
| ErrorOnCodingFailure
| DropOnCodingFailure
deriving (Int -> CodingFailureMode -> [Char] -> [Char]
[CodingFailureMode] -> [Char] -> [Char]
CodingFailureMode -> [Char]
(Int -> CodingFailureMode -> [Char] -> [Char])
-> (CodingFailureMode -> [Char])
-> ([CodingFailureMode] -> [Char] -> [Char])
-> Show CodingFailureMode
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
showList :: [CodingFailureMode] -> [Char] -> [Char]
$cshowList :: [CodingFailureMode] -> [Char] -> [Char]
show :: CodingFailureMode -> [Char]
$cshow :: CodingFailureMode -> [Char]
showsPrec :: Int -> CodingFailureMode -> [Char] -> [Char]
$cshowsPrec :: Int -> CodingFailureMode -> [Char] -> [Char]
Show)
{-# INLINE replacementChar #-}
replacementChar :: Char
replacementChar :: Char
replacementChar = Char
'\xFFFD'
{-# INLINE_NORMAL decodeUtf8WithD #-}
decodeUtf8WithD :: Monad m
=> CodingFailureMode -> Stream m Word8 -> Stream m Char
decodeUtf8WithD :: CodingFailureMode -> Stream m Word8 -> Stream m Char
decodeUtf8WithD CodingFailureMode
cfm (Stream State Stream m Word8 -> s -> m (Step s Word8)
step s
state) =
let A.Array ArrayContents
_ Ptr Word8
ptr Ptr Word8
_ = Array Word8
utf8d
in (State Stream m Char
-> UTF8DecodeState s Char
-> m (Step (UTF8DecodeState s Char) Char))
-> UTF8DecodeState s Char -> Stream m Char
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream (Ptr Word8
-> State Stream m Char
-> UTF8DecodeState s Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a.
Ptr Word8
-> State Stream m a
-> UTF8DecodeState s Char
-> m (Step (UTF8DecodeState s Char) Char)
step' Ptr Word8
ptr) (s -> UTF8DecodeState s Char
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
state)
where
prefix :: [Char]
prefix = [Char]
"Streamly.Internal.Data.Stream.StreamD.decodeUtf8With: "
{-# INLINE handleError #-}
handleError :: [Char] -> UTF8DecodeState s Char -> UTF8DecodeState s Char
handleError [Char]
e UTF8DecodeState s Char
s =
case CodingFailureMode
cfm of
CodingFailureMode
ErrorOnCodingFailure -> [Char] -> UTF8DecodeState s Char
forall a. HasCallStack => [Char] -> a
error [Char]
e
CodingFailureMode
TransliterateCodingFailure -> Char -> UTF8DecodeState s Char -> UTF8DecodeState s Char
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue Char
replacementChar UTF8DecodeState s Char
s
CodingFailureMode
DropOnCodingFailure -> UTF8DecodeState s Char
s
{-# INLINE handleUnderflow #-}
handleUnderflow :: UTF8DecodeState s Char
handleUnderflow =
case CodingFailureMode
cfm of
CodingFailureMode
ErrorOnCodingFailure -> [Char] -> UTF8DecodeState s Char
forall a. HasCallStack => [Char] -> a
error ([Char] -> UTF8DecodeState s Char)
-> [Char] -> UTF8DecodeState s Char
forall a b. (a -> b) -> a -> b
$ [Char]
prefix [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"Not enough input"
CodingFailureMode
TransliterateCodingFailure -> Char -> UTF8DecodeState s Char -> UTF8DecodeState s Char
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue Char
replacementChar UTF8DecodeState s Char
forall s a. UTF8DecodeState s a
Done
CodingFailureMode
DropOnCodingFailure -> UTF8DecodeState s Char
forall s a. UTF8DecodeState s a
Done
{-# INLINE_LATE step' #-}
step' :: Ptr Word8
-> State Stream m a
-> UTF8DecodeState s Char
-> m (Step (UTF8DecodeState s Char) Char)
step' Ptr Word8
_ State Stream m a
gst (UTF8DecodeInit s
st) = do
Step s Word8
r <- State Stream m Word8 -> s -> m (Step s Word8)
step (State Stream m a -> State Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$ case Step s Word8
r of
Yield Word8
x s
s -> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (s -> Word8 -> UTF8DecodeState s Char
forall s a. s -> Word8 -> UTF8DecodeState s a
UTF8DecodeInit1 s
s Word8
x)
Skip s
s -> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (s -> UTF8DecodeState s Char
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
s)
Step s Word8
Stop -> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip UTF8DecodeState s Char
forall s a. UTF8DecodeState s a
Done
step' Ptr Word8
_ State Stream m a
_ (UTF8DecodeInit1 s
st Word8
x) = do
case Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
> Word8
0x7f of
Bool
False ->
Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$ UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char)
-> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall a b. (a -> b) -> a -> b
$ Char -> UTF8DecodeState s Char -> UTF8DecodeState s Char
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue
(Int -> Char
unsafeChr (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x))
(s -> UTF8DecodeState s Char
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
st)
Bool
True -> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$ UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char)
-> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall a b. (a -> b) -> a -> b
$ s -> Word8 -> UTF8DecodeState s Char
forall s a. s -> Word8 -> UTF8DecodeState s a
UTF8DecodeFirst s
st Word8
x
step' Ptr Word8
table State Stream m a
_ (UTF8DecodeFirst s
st Word8
x) = do
let (Tuple' Word8
sv Int
cp) = Ptr Word8 -> Word8 -> Tuple' Word8 Int
decode0 Ptr Word8
table Word8
x
Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$
case Word8
sv of
Word8
12 ->
let msg :: [Char]
msg = [Char]
prefix [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"Invalid first UTF8 byte " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word8 -> [Char]
forall a. Show a => a -> [Char]
show Word8
x
in UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char)
-> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall a b. (a -> b) -> a -> b
$ [Char] -> UTF8DecodeState s Char -> UTF8DecodeState s Char
forall s.
[Char] -> UTF8DecodeState s Char -> UTF8DecodeState s Char
handleError [Char]
msg (s -> UTF8DecodeState s Char
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
st)
Word8
0 -> [Char] -> Step (UTF8DecodeState s Char) Char
forall a. HasCallStack => [Char] -> a
error [Char]
"unreachable state"
Word8
_ -> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (s -> Word8 -> Int -> UTF8DecodeState s Char
forall s a. s -> Word8 -> Int -> UTF8DecodeState s a
UTF8Decoding s
st Word8
sv Int
cp)
step' Ptr Word8
table State Stream m a
gst (UTF8Decoding s
st Word8
statePtr Int
codepointPtr) = do
Step s Word8
r <- State Stream m Word8 -> s -> m (Step s Word8)
step (State Stream m a -> State Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
case Step s Word8
r of
Yield Word8
x s
s -> do
let (Tuple' Word8
sv Int
cp) = Ptr Word8 -> Word8 -> Int -> Word8 -> Tuple' Word8 Int
decode1 Ptr Word8
table Word8
statePtr Int
codepointPtr Word8
x
Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$ case Word8
sv of
Word8
0 -> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char)
-> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall a b. (a -> b) -> a -> b
$ Char -> UTF8DecodeState s Char -> UTF8DecodeState s Char
forall s a. a -> UTF8DecodeState s a -> UTF8DecodeState s a
YieldAndContinue
(Int -> Char
unsafeChr Int
cp) (s -> UTF8DecodeState s Char
forall s a. s -> UTF8DecodeState s a
UTF8DecodeInit s
s)
Word8
12 ->
let msg :: [Char]
msg = [Char]
prefix
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"Invalid subsequent UTF8 byte "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word8 -> [Char]
forall a. Show a => a -> [Char]
show Word8
x
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" in state "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word8 -> [Char]
forall a. Show a => a -> [Char]
show Word8
statePtr
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" accumulated value "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
codepointPtr
in UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char)
-> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall a b. (a -> b) -> a -> b
$ [Char] -> UTF8DecodeState s Char -> UTF8DecodeState s Char
forall s.
[Char] -> UTF8DecodeState s Char -> UTF8DecodeState s Char
handleError [Char]
msg (s -> Word8 -> UTF8DecodeState s Char
forall s a. s -> Word8 -> UTF8DecodeState s a
UTF8DecodeInit1 s
s Word8
x)
Word8
_ -> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (s -> Word8 -> Int -> UTF8DecodeState s Char
forall s a. s -> Word8 -> Int -> UTF8DecodeState s a
UTF8Decoding s
s Word8
sv Int
cp)
Skip s
s -> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$
UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip (s -> Word8 -> Int -> UTF8DecodeState s Char
forall s a. s -> Word8 -> Int -> UTF8DecodeState s a
UTF8Decoding s
s Word8
statePtr Int
codepointPtr)
Step s Word8
Stop -> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$ UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. s -> Step s a
Skip UTF8DecodeState s Char
forall s. UTF8DecodeState s Char
handleUnderflow
step' Ptr Word8
_ State Stream m a
_ (YieldAndContinue Char
c UTF8DecodeState s Char
s) = Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char))
-> Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall a b. (a -> b) -> a -> b
$ Char
-> UTF8DecodeState s Char -> Step (UTF8DecodeState s Char) Char
forall s a. a -> s -> Step s a
Yield Char
c UTF8DecodeState s Char
s
step' Ptr Word8
_ State Stream m a
_ UTF8DecodeState s Char
Done = Step (UTF8DecodeState s Char) Char
-> m (Step (UTF8DecodeState s Char) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return Step (UTF8DecodeState s Char) Char
forall s a. Step s a
Stop
{-# INLINE decodeUtf8D #-}
decodeUtf8D :: Monad m => Stream m Word8 -> Stream m Char
decodeUtf8D :: Stream m Word8 -> Stream m Char
decodeUtf8D = CodingFailureMode -> Stream m Word8 -> Stream m Char
forall (m :: * -> *).
Monad m =>
CodingFailureMode -> Stream m Word8 -> Stream m Char
decodeUtf8WithD CodingFailureMode
TransliterateCodingFailure
{-# INLINE decodeUtf8 #-}
decodeUtf8 :: (Monad m, IsStream t) => t m Word8 -> t m Char
decodeUtf8 :: t m Word8 -> t m Char
decodeUtf8 = Stream m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Char -> t m Char)
-> (t m Word8 -> Stream m Char) -> t m Word8 -> t m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m Word8 -> Stream m Char
forall (m :: * -> *). Monad m => Stream m Word8 -> Stream m Char
decodeUtf8D (Stream m Word8 -> Stream m Char)
-> (t m Word8 -> Stream m Word8) -> t m Word8 -> Stream m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Word8 -> Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# INLINE decodeUtf8D' #-}
decodeUtf8D' :: Monad m => Stream m Word8 -> Stream m Char
decodeUtf8D' :: Stream m Word8 -> Stream m Char
decodeUtf8D' = CodingFailureMode -> Stream m Word8 -> Stream m Char
forall (m :: * -> *).
Monad m =>
CodingFailureMode -> Stream m Word8 -> Stream m Char
decodeUtf8WithD CodingFailureMode
ErrorOnCodingFailure
{-# INLINE decodeUtf8' #-}
decodeUtf8' :: (Monad m, IsStream t) => t m Word8 -> t m Char
decodeUtf8' :: t m Word8 -> t m Char
decodeUtf8' = Stream m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Char -> t m Char)
-> (t m Word8 -> Stream m Char) -> t m Word8 -> t m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m Word8 -> Stream m Char
forall (m :: * -> *). Monad m => Stream m Word8 -> Stream m Char
decodeUtf8D' (Stream m Word8 -> Stream m Char)
-> (t m Word8 -> Stream m Word8) -> t m Word8 -> Stream m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Word8 -> Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# INLINE decodeUtf8D_ #-}
decodeUtf8D_ :: Monad m => Stream m Word8 -> Stream m Char
decodeUtf8D_ :: Stream m Word8 -> Stream m Char
decodeUtf8D_ = CodingFailureMode -> Stream m Word8 -> Stream m Char
forall (m :: * -> *).
Monad m =>
CodingFailureMode -> Stream m Word8 -> Stream m Char
decodeUtf8WithD CodingFailureMode
DropOnCodingFailure
{-# INLINE decodeUtf8_ #-}
decodeUtf8_ :: (Monad m, IsStream t) => t m Word8 -> t m Char
decodeUtf8_ :: t m Word8 -> t m Char
decodeUtf8_ = Stream m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Char -> t m Char)
-> (t m Word8 -> Stream m Char) -> t m Word8 -> t m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m Word8 -> Stream m Char
forall (m :: * -> *). Monad m => Stream m Word8 -> Stream m Char
decodeUtf8D_ (Stream m Word8 -> Stream m Char)
-> (t m Word8 -> Stream m Word8) -> t m Word8 -> Stream m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Word8 -> Stream m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# DEPRECATED decodeUtf8Lax "Please use 'decodeUtf8' instead" #-}
{-# INLINE decodeUtf8Lax #-}
decodeUtf8Lax :: (IsStream t, Monad m) => t m Word8 -> t m Char
decodeUtf8Lax :: t m Word8 -> t m Char
decodeUtf8Lax = t m Word8 -> t m Char
forall (m :: * -> *) (t :: (* -> *) -> * -> *).
(Monad m, IsStream t) =>
t m Word8 -> t m Char
decodeUtf8
#ifndef __GHCJS__
{-# ANN type FlattenState Fuse #-}
#endif
data FlattenState s a
= OuterLoop s !(Maybe (DecodeState, CodePoint))
| InnerLoopDecodeInit s ArrayContents !(Ptr a) !(Ptr a)
| InnerLoopDecodeFirst s ArrayContents !(Ptr a) !(Ptr a) Word8
| InnerLoopDecoding s ArrayContents !(Ptr a) !(Ptr a)
!DecodeState !CodePoint
| YAndC !Char (FlattenState s a)
| D
{-# INLINE_NORMAL decodeUtf8ArraysWithD #-}
decodeUtf8ArraysWithD ::
MonadIO m
=> CodingFailureMode
-> Stream m (A.Array Word8)
-> Stream m Char
decodeUtf8ArraysWithD :: CodingFailureMode -> Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysWithD CodingFailureMode
cfm (Stream State Stream m (Array Word8) -> s -> m (Step s (Array Word8))
step s
state) =
let A.Array ArrayContents
_ Ptr Word8
ptr Ptr Word8
_ = Array Word8
utf8d
in (State Stream m Char
-> FlattenState s Word8 -> m (Step (FlattenState s Word8) Char))
-> FlattenState s Word8 -> Stream m Char
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream (Ptr Word8
-> State Stream m Char
-> FlattenState s Word8
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a.
Ptr Word8
-> State Stream m a
-> FlattenState s Word8
-> m (Step (FlattenState s Word8) Char)
step' Ptr Word8
ptr) (s -> Maybe (Word8, Int) -> FlattenState s Word8
forall s a. s -> Maybe (Word8, Int) -> FlattenState s a
OuterLoop s
state Maybe (Word8, Int)
forall a. Maybe a
Nothing)
where
{-# INLINE transliterateOrError #-}
transliterateOrError :: [Char] -> FlattenState s a -> FlattenState s a
transliterateOrError [Char]
e FlattenState s a
s =
case CodingFailureMode
cfm of
CodingFailureMode
ErrorOnCodingFailure -> [Char] -> FlattenState s a
forall a. HasCallStack => [Char] -> a
error [Char]
e
CodingFailureMode
TransliterateCodingFailure -> Char -> FlattenState s a -> FlattenState s a
forall s a. Char -> FlattenState s a -> FlattenState s a
YAndC Char
replacementChar FlattenState s a
s
CodingFailureMode
DropOnCodingFailure -> FlattenState s a
s
{-# INLINE inputUnderflow #-}
inputUnderflow :: FlattenState s a
inputUnderflow =
case CodingFailureMode
cfm of
CodingFailureMode
ErrorOnCodingFailure ->
[Char] -> FlattenState s a
forall a. HasCallStack => [Char] -> a
error ([Char] -> FlattenState s a) -> [Char] -> FlattenState s a
forall a b. (a -> b) -> a -> b
$
[Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
"Streamly.Internal.Data.Stream.StreamD."
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"decodeUtf8ArraysWith: Input Underflow"
CodingFailureMode
TransliterateCodingFailure -> Char -> FlattenState s a -> FlattenState s a
forall s a. Char -> FlattenState s a -> FlattenState s a
YAndC Char
replacementChar FlattenState s a
forall s a. FlattenState s a
D
CodingFailureMode
DropOnCodingFailure -> FlattenState s a
forall s a. FlattenState s a
D
{-# INLINE_LATE step' #-}
step' :: Ptr Word8
-> State Stream m a
-> FlattenState s Word8
-> m (Step (FlattenState s Word8) Char)
step' Ptr Word8
_ State Stream m a
gst (OuterLoop s
st Maybe (Word8, Int)
Nothing) = do
Step s (Array Word8)
r <- State Stream m (Array Word8) -> s -> m (Step s (Array Word8))
step (State Stream m a -> State Stream m (Array Word8)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$
case Step s (Array Word8)
r of
Yield A.Array {Ptr Word8
ArrayContents
aEnd :: forall a. Array a -> Ptr a
arrStart :: forall a. Array a -> Ptr a
arrContents :: forall a. Array a -> ArrayContents
aEnd :: Ptr Word8
arrStart :: Ptr Word8
arrContents :: ArrayContents
..} s
s ->
FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (s
-> ArrayContents -> Ptr Word8 -> Ptr Word8 -> FlattenState s Word8
forall s a.
s -> ArrayContents -> Ptr a -> Ptr a -> FlattenState s a
InnerLoopDecodeInit s
s ArrayContents
arrContents Ptr Word8
arrStart Ptr Word8
aEnd)
Skip s
s -> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (s -> Maybe (Word8, Int) -> FlattenState s Word8
forall s a. s -> Maybe (Word8, Int) -> FlattenState s a
OuterLoop s
s Maybe (Word8, Int)
forall a. Maybe a
Nothing)
Step s (Array Word8)
Stop -> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip FlattenState s Word8
forall s a. FlattenState s a
D
step' Ptr Word8
_ State Stream m a
gst (OuterLoop s
st dst :: Maybe (Word8, Int)
dst@(Just (Word8
ds, Int
cp))) = do
Step s (Array Word8)
r <- State Stream m (Array Word8) -> s -> m (Step s (Array Word8))
step (State Stream m a -> State Stream m (Array Word8)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$
case Step s (Array Word8)
r of
Yield A.Array {Ptr Word8
ArrayContents
aEnd :: Ptr Word8
arrStart :: Ptr Word8
arrContents :: ArrayContents
aEnd :: forall a. Array a -> Ptr a
arrStart :: forall a. Array a -> Ptr a
arrContents :: forall a. Array a -> ArrayContents
..} s
s ->
FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (s
-> ArrayContents
-> Ptr Word8
-> Ptr Word8
-> Word8
-> Int
-> FlattenState s Word8
forall s a.
s
-> ArrayContents
-> Ptr a
-> Ptr a
-> Word8
-> Int
-> FlattenState s a
InnerLoopDecoding s
s ArrayContents
arrContents Ptr Word8
arrStart Ptr Word8
aEnd Word8
ds Int
cp)
Skip s
s -> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (s -> Maybe (Word8, Int) -> FlattenState s Word8
forall s a. s -> Maybe (Word8, Int) -> FlattenState s a
OuterLoop s
s Maybe (Word8, Int)
dst)
Step s (Array Word8)
Stop -> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip FlattenState s Word8
forall s a. FlattenState s a
inputUnderflow
step' Ptr Word8
_ State Stream m a
_ (InnerLoopDecodeInit s
st ArrayContents
startf Ptr Word8
p Ptr Word8
end)
| Ptr Word8
p Ptr Word8 -> Ptr Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr Word8
end = do
IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ ArrayContents -> IO ()
touch ArrayContents
startf
Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$ FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (FlattenState s Word8 -> Step (FlattenState s Word8) Char)
-> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall a b. (a -> b) -> a -> b
$ s -> Maybe (Word8, Int) -> FlattenState s Word8
forall s a. s -> Maybe (Word8, Int) -> FlattenState s a
OuterLoop s
st Maybe (Word8, Int)
forall a. Maybe a
Nothing
step' Ptr Word8
_ State Stream m a
_ (InnerLoopDecodeInit s
st ArrayContents
startf Ptr Word8
p Ptr Word8
end) = do
Word8
x <- IO Word8 -> m Word8
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Word8 -> m Word8) -> IO Word8 -> m Word8
forall a b. (a -> b) -> a -> b
$ Ptr Word8 -> IO Word8
forall a. Storable a => Ptr a -> IO a
peek Ptr Word8
p
case Word8
x Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
> Word8
0x7f of
Bool
False ->
Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$ FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (FlattenState s Word8 -> Step (FlattenState s Word8) Char)
-> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall a b. (a -> b) -> a -> b
$ Char -> FlattenState s Word8 -> FlattenState s Word8
forall s a. Char -> FlattenState s a -> FlattenState s a
YAndC
(Int -> Char
unsafeChr (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x))
(s
-> ArrayContents -> Ptr Word8 -> Ptr Word8 -> FlattenState s Word8
forall s a.
s -> ArrayContents -> Ptr a -> Ptr a -> FlattenState s a
InnerLoopDecodeInit s
st ArrayContents
startf (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1) Ptr Word8
end)
Bool
True -> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$ FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (FlattenState s Word8 -> Step (FlattenState s Word8) Char)
-> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall a b. (a -> b) -> a -> b
$ s
-> ArrayContents
-> Ptr Word8
-> Ptr Word8
-> Word8
-> FlattenState s Word8
forall s a.
s -> ArrayContents -> Ptr a -> Ptr a -> Word8 -> FlattenState s a
InnerLoopDecodeFirst s
st ArrayContents
startf Ptr Word8
p Ptr Word8
end Word8
x
step' Ptr Word8
table State Stream m a
_ (InnerLoopDecodeFirst s
st ArrayContents
startf Ptr Word8
p Ptr Word8
end Word8
x) = do
let (Tuple' Word8
sv Int
cp) = Ptr Word8 -> Word8 -> Tuple' Word8 Int
decode0 Ptr Word8
table Word8
x
Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$
case Word8
sv of
Word8
12 ->
FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (FlattenState s Word8 -> Step (FlattenState s Word8) Char)
-> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall a b. (a -> b) -> a -> b
$
[Char] -> FlattenState s Word8 -> FlattenState s Word8
forall s a. [Char] -> FlattenState s a -> FlattenState s a
transliterateOrError
(
[Char]
"Streamly.Internal.Data.Stream.StreamD."
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"decodeUtf8ArraysWith: Invalid UTF8"
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" codepoint encountered"
)
(s
-> ArrayContents -> Ptr Word8 -> Ptr Word8 -> FlattenState s Word8
forall s a.
s -> ArrayContents -> Ptr a -> Ptr a -> FlattenState s a
InnerLoopDecodeInit s
st ArrayContents
startf (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1) Ptr Word8
end)
Word8
0 -> [Char] -> Step (FlattenState s Word8) Char
forall a. HasCallStack => [Char] -> a
error [Char]
"unreachable state"
Word8
_ -> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (s
-> ArrayContents
-> Ptr Word8
-> Ptr Word8
-> Word8
-> Int
-> FlattenState s Word8
forall s a.
s
-> ArrayContents
-> Ptr a
-> Ptr a
-> Word8
-> Int
-> FlattenState s a
InnerLoopDecoding s
st ArrayContents
startf (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1) Ptr Word8
end Word8
sv Int
cp)
step' Ptr Word8
_ State Stream m a
_ (InnerLoopDecoding s
st ArrayContents
startf Ptr Word8
p Ptr Word8
end Word8
sv Int
cp)
| Ptr Word8
p Ptr Word8 -> Ptr Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr Word8
end = do
IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ ArrayContents -> IO ()
touch ArrayContents
startf
Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$ FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (FlattenState s Word8 -> Step (FlattenState s Word8) Char)
-> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall a b. (a -> b) -> a -> b
$ s -> Maybe (Word8, Int) -> FlattenState s Word8
forall s a. s -> Maybe (Word8, Int) -> FlattenState s a
OuterLoop s
st ((Word8, Int) -> Maybe (Word8, Int)
forall a. a -> Maybe a
Just (Word8
sv, Int
cp))
step' Ptr Word8
table State Stream m a
_ (InnerLoopDecoding s
st ArrayContents
startf Ptr Word8
p Ptr Word8
end Word8
statePtr Int
codepointPtr) = do
Word8
x <- IO Word8 -> m Word8
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Word8 -> m Word8) -> IO Word8 -> m Word8
forall a b. (a -> b) -> a -> b
$ Ptr Word8 -> IO Word8
forall a. Storable a => Ptr a -> IO a
peek Ptr Word8
p
let (Tuple' Word8
sv Int
cp) = Ptr Word8 -> Word8 -> Int -> Word8 -> Tuple' Word8 Int
decode1 Ptr Word8
table Word8
statePtr Int
codepointPtr Word8
x
Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$
case Word8
sv of
Word8
0 ->
FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (FlattenState s Word8 -> Step (FlattenState s Word8) Char)
-> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall a b. (a -> b) -> a -> b
$
Char -> FlattenState s Word8 -> FlattenState s Word8
forall s a. Char -> FlattenState s a -> FlattenState s a
YAndC
(Int -> Char
unsafeChr Int
cp)
(s
-> ArrayContents -> Ptr Word8 -> Ptr Word8 -> FlattenState s Word8
forall s a.
s -> ArrayContents -> Ptr a -> Ptr a -> FlattenState s a
InnerLoopDecodeInit s
st ArrayContents
startf (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1) Ptr Word8
end)
Word8
12 ->
FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip (FlattenState s Word8 -> Step (FlattenState s Word8) Char)
-> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall a b. (a -> b) -> a -> b
$
[Char] -> FlattenState s Word8 -> FlattenState s Word8
forall s a. [Char] -> FlattenState s a -> FlattenState s a
transliterateOrError
(
[Char]
"Streamly.Internal.Data.Stream.StreamD."
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"decodeUtf8ArraysWith: Invalid UTF8"
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" codepoint encountered"
)
(s
-> ArrayContents -> Ptr Word8 -> Ptr Word8 -> FlattenState s Word8
forall s a.
s -> ArrayContents -> Ptr a -> Ptr a -> FlattenState s a
InnerLoopDecodeInit s
st ArrayContents
startf (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1) Ptr Word8
end)
Word8
_ ->
FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. s -> Step s a
Skip
(s
-> ArrayContents
-> Ptr Word8
-> Ptr Word8
-> Word8
-> Int
-> FlattenState s Word8
forall s a.
s
-> ArrayContents
-> Ptr a
-> Ptr a
-> Word8
-> Int
-> FlattenState s a
InnerLoopDecoding s
st ArrayContents
startf (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1) Ptr Word8
end Word8
sv Int
cp)
step' Ptr Word8
_ State Stream m a
_ (YAndC Char
c FlattenState s Word8
s) = Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char))
-> Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall a b. (a -> b) -> a -> b
$ Char -> FlattenState s Word8 -> Step (FlattenState s Word8) Char
forall s a. a -> s -> Step s a
Yield Char
c FlattenState s Word8
s
step' Ptr Word8
_ State Stream m a
_ FlattenState s Word8
D = Step (FlattenState s Word8) Char
-> m (Step (FlattenState s Word8) Char)
forall (m :: * -> *) a. Monad m => a -> m a
return Step (FlattenState s Word8) Char
forall s a. Step s a
Stop
{-# INLINE decodeUtf8ArraysD #-}
decodeUtf8ArraysD ::
MonadIO m
=> Stream m (A.Array Word8)
-> Stream m Char
decodeUtf8ArraysD :: Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysD = CodingFailureMode -> Stream m (Array Word8) -> Stream m Char
forall (m :: * -> *).
MonadIO m =>
CodingFailureMode -> Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysWithD CodingFailureMode
TransliterateCodingFailure
{-# INLINE decodeUtf8Arrays #-}
decodeUtf8Arrays ::
(MonadIO m, IsStream t) => t m (Array Word8) -> t m Char
decodeUtf8Arrays :: t m (Array Word8) -> t m Char
decodeUtf8Arrays =
Stream m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Char -> t m Char)
-> (t m (Array Word8) -> Stream m Char)
-> t m (Array Word8)
-> t m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m (Array Word8) -> Stream m Char
forall (m :: * -> *).
MonadIO m =>
Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysD (Stream m (Array Word8) -> Stream m Char)
-> (t m (Array Word8) -> Stream m (Array Word8))
-> t m (Array Word8)
-> Stream m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m (Array Word8) -> Stream m (Array Word8)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# INLINE decodeUtf8ArraysD' #-}
decodeUtf8ArraysD' ::
MonadIO m
=> Stream m (A.Array Word8)
-> Stream m Char
decodeUtf8ArraysD' :: Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysD' = CodingFailureMode -> Stream m (Array Word8) -> Stream m Char
forall (m :: * -> *).
MonadIO m =>
CodingFailureMode -> Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysWithD CodingFailureMode
ErrorOnCodingFailure
{-# INLINE decodeUtf8Arrays' #-}
decodeUtf8Arrays' :: (MonadIO m, IsStream t) => t m (Array Word8) -> t m Char
decodeUtf8Arrays' :: t m (Array Word8) -> t m Char
decodeUtf8Arrays' = Stream m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Char -> t m Char)
-> (t m (Array Word8) -> Stream m Char)
-> t m (Array Word8)
-> t m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m (Array Word8) -> Stream m Char
forall (m :: * -> *).
MonadIO m =>
Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysD' (Stream m (Array Word8) -> Stream m Char)
-> (t m (Array Word8) -> Stream m (Array Word8))
-> t m (Array Word8)
-> Stream m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m (Array Word8) -> Stream m (Array Word8)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# INLINE decodeUtf8ArraysD_ #-}
decodeUtf8ArraysD_ ::
MonadIO m
=> Stream m (A.Array Word8)
-> Stream m Char
decodeUtf8ArraysD_ :: Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysD_ = CodingFailureMode -> Stream m (Array Word8) -> Stream m Char
forall (m :: * -> *).
MonadIO m =>
CodingFailureMode -> Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysWithD CodingFailureMode
DropOnCodingFailure
{-# INLINE decodeUtf8Arrays_ #-}
decodeUtf8Arrays_ ::
(MonadIO m, IsStream t) => t m (Array Word8) -> t m Char
decodeUtf8Arrays_ :: t m (Array Word8) -> t m Char
decodeUtf8Arrays_ =
Stream m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Char -> t m Char)
-> (t m (Array Word8) -> Stream m Char)
-> t m (Array Word8)
-> t m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m (Array Word8) -> Stream m Char
forall (m :: * -> *).
MonadIO m =>
Stream m (Array Word8) -> Stream m Char
decodeUtf8ArraysD_ (Stream m (Array Word8) -> Stream m Char)
-> (t m (Array Word8) -> Stream m (Array Word8))
-> t m (Array Word8)
-> Stream m Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m (Array Word8) -> Stream m (Array Word8)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
data WList = WCons !Word8 !WList | WNil
{-# INLINE ord2 #-}
ord2 :: Char -> WList
ord2 :: Char -> WList
ord2 Char
c = Bool -> WList -> WList
forall a. HasCallStack => Bool -> a -> a
assert (Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0x80 Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0x07ff) (Word8 -> WList -> WList
WCons Word8
x1 (Word8 -> WList -> WList
WCons Word8
x2 WList
WNil))
where
n :: Int
n = Char -> Int
ord Char
c
x1 :: Word8
x1 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ (Int
n Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
6) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0xC0
x2 :: Word8
x2 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ (Int
n Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3F) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0x80
{-# INLINE ord3 #-}
ord3 :: Char -> WList
ord3 :: Char -> WList
ord3 Char
c = Bool -> WList -> WList
forall a. HasCallStack => Bool -> a -> a
assert (Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0x0800 Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0xffff) (Word8 -> WList -> WList
WCons Word8
x1 (Word8 -> WList -> WList
WCons Word8
x2 (Word8 -> WList -> WList
WCons Word8
x3 WList
WNil)))
where
n :: Int
n = Char -> Int
ord Char
c
x1 :: Word8
x1 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ (Int
n Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
12) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0xE0
x2 :: Word8
x2 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ ((Int
n Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
6) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3F) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0x80
x3 :: Word8
x3 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ (Int
n Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3F) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0x80
{-# INLINE ord4 #-}
ord4 :: Char -> WList
ord4 :: Char -> WList
ord4 Char
c = Bool -> WList -> WList
forall a. HasCallStack => Bool -> a -> a
assert (Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0x10000) (Word8 -> WList -> WList
WCons Word8
x1 (Word8 -> WList -> WList
WCons Word8
x2 (Word8 -> WList -> WList
WCons Word8
x3 (Word8 -> WList -> WList
WCons Word8
x4 WList
WNil))))
where
n :: Int
n = Char -> Int
ord Char
c
x1 :: Word8
x1 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ (Int
n Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
18) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0xF0
x2 :: Word8
x2 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ ((Int
n Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
12) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3F) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0x80
x3 :: Word8
x3 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ ((Int
n Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
6) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3F) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0x80
x4 :: Word8
x4 = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> Int -> Word8
forall a b. (a -> b) -> a -> b
$ (Int
n Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0x3F) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
0x80
#ifndef __GHCJS__
{-# ANN type EncodeState Fuse #-}
#endif
data EncodeState s = EncodeState s !WList
#ifndef __GHCJS__
{-# ANN type InvalidAction Fuse #-}
#endif
data InvalidAction =
DropInvalid | ErrorInvalid | IgnoreInvalid | ReplaceInvalid
replaceInvalid :: s -> Step (EncodeState s) a
replaceInvalid :: s -> Step (EncodeState s) a
replaceInvalid s
s =
EncodeState s -> Step (EncodeState s) a
forall s a. s -> Step s a
Skip (EncodeState s -> Step (EncodeState s) a)
-> EncodeState s -> Step (EncodeState s) a
forall a b. (a -> b) -> a -> b
$ s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s (Word8 -> WList -> WList
WCons Word8
239 (Word8 -> WList -> WList
WCons Word8
191 (Word8 -> WList -> WList
WCons Word8
189 WList
WNil)))
dropInvalid :: s -> Step (EncodeState s) a
dropInvalid :: s -> Step (EncodeState s) a
dropInvalid s
s = EncodeState s -> Step (EncodeState s) a
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s WList
WNil)
errorOnInvalid :: s -> Step (EncodeState s) a
errorOnInvalid :: s -> Step (EncodeState s) a
errorOnInvalid s
_ =
[Char] -> Step (EncodeState s) a
forall a. HasCallStack => [Char] -> a
error ([Char] -> Step (EncodeState s) a)
-> [Char] -> Step (EncodeState s) a
forall a b. (a -> b) -> a -> b
$
[Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
"Streamly.Internal.Data.Stream.StreamD.encodeUtf8:"
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"Encountered a surrogate"
{-# INLINE_NORMAL encodeUtf8DGeneric #-}
encodeUtf8DGeneric ::
Monad m
=> InvalidAction
-> Stream m Char
-> Stream m Word8
encodeUtf8DGeneric :: InvalidAction -> Stream m Char -> Stream m Word8
encodeUtf8DGeneric InvalidAction
act (Stream State Stream m Char -> s -> m (Step s Char)
step s
state) =
(State Stream m Word8
-> EncodeState s -> m (Step (EncodeState s) Word8))
-> EncodeState s -> Stream m Word8
forall (m :: * -> *) a s.
(State Stream m a -> s -> m (Step s a)) -> s -> Stream m a
Stream State Stream m Word8
-> EncodeState s -> m (Step (EncodeState s) Word8)
forall (m :: * -> *) a.
State Stream m a -> EncodeState s -> m (Step (EncodeState s) Word8)
step' (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
state WList
WNil)
where
{-# INLINE_LATE step' #-}
step' :: State Stream m a -> EncodeState s -> m (Step (EncodeState s) Word8)
step' State Stream m a
gst (EncodeState s
st WList
WNil) = do
Step s Char
r <- State Stream m Char -> s -> m (Step s Char)
step (State Stream m a -> State Stream m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a (n :: * -> *) b.
State t m a -> State t n b
adaptState State Stream m a
gst) s
st
Step (EncodeState s) Word8 -> m (Step (EncodeState s) Word8)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (EncodeState s) Word8 -> m (Step (EncodeState s) Word8))
-> Step (EncodeState s) Word8 -> m (Step (EncodeState s) Word8)
forall a b. (a -> b) -> a -> b
$
case Step s Char
r of
Yield Char
c s
s ->
case Char -> Int
ord Char
c of
Int
x | Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0x7F ->
Word8 -> EncodeState s -> Step (EncodeState s) Word8
forall s a. a -> s -> Step s a
Yield (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s WList
WNil)
| Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0x7FF -> EncodeState s -> Step (EncodeState s) Word8
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s (Char -> WList
ord2 Char
c))
| Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0xFFFF ->
case InvalidAction
act of
InvalidAction
DropInvalid ->
if Char -> Bool
isSurrogate Char
c
then s -> Step (EncodeState s) Word8
forall s a. s -> Step (EncodeState s) a
dropInvalid s
s
else EncodeState s -> Step (EncodeState s) Word8
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s (Char -> WList
ord3 Char
c))
InvalidAction
ErrorInvalid ->
if Char -> Bool
isSurrogate Char
c
then s -> Step (EncodeState s) Word8
forall s a. s -> Step (EncodeState s) a
errorOnInvalid s
s
else EncodeState s -> Step (EncodeState s) Word8
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s (Char -> WList
ord3 Char
c))
InvalidAction
IgnoreInvalid ->
EncodeState s -> Step (EncodeState s) Word8
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s (Char -> WList
ord3 Char
c))
InvalidAction
ReplaceInvalid ->
if Char -> Bool
isSurrogate Char
c
then s -> Step (EncodeState s) Word8
forall s a. s -> Step (EncodeState s) a
replaceInvalid s
s
else EncodeState s -> Step (EncodeState s) Word8
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s (Char -> WList
ord3 Char
c))
| Bool
otherwise -> EncodeState s -> Step (EncodeState s) Word8
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s (Char -> WList
ord4 Char
c))
Skip s
s -> EncodeState s -> Step (EncodeState s) Word8
forall s a. s -> Step s a
Skip (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s WList
WNil)
Step s Char
Stop -> Step (EncodeState s) Word8
forall s a. Step s a
Stop
step' State Stream m a
_ (EncodeState s
s (WCons Word8
x WList
xs)) = Step (EncodeState s) Word8 -> m (Step (EncodeState s) Word8)
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (EncodeState s) Word8 -> m (Step (EncodeState s) Word8))
-> Step (EncodeState s) Word8 -> m (Step (EncodeState s) Word8)
forall a b. (a -> b) -> a -> b
$ Word8 -> EncodeState s -> Step (EncodeState s) Word8
forall s a. a -> s -> Step s a
Yield Word8
x (s -> WList -> EncodeState s
forall s. s -> WList -> EncodeState s
EncodeState s
s WList
xs)
{-# INLINE_NORMAL encodeUtf8D' #-}
encodeUtf8D' :: Monad m => Stream m Char -> Stream m Word8
encodeUtf8D' :: Stream m Char -> Stream m Word8
encodeUtf8D' = InvalidAction -> Stream m Char -> Stream m Word8
forall (m :: * -> *).
Monad m =>
InvalidAction -> Stream m Char -> Stream m Word8
encodeUtf8DGeneric InvalidAction
ErrorInvalid
{-# INLINE encodeUtf8' #-}
encodeUtf8' :: (Monad m, IsStream t) => t m Char -> t m Word8
encodeUtf8' :: t m Char -> t m Word8
encodeUtf8' = Stream m Word8 -> t m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Word8 -> t m Word8)
-> (t m Char -> Stream m Word8) -> t m Char -> t m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m Char -> Stream m Word8
forall (m :: * -> *). Monad m => Stream m Char -> Stream m Word8
encodeUtf8D' (Stream m Char -> Stream m Word8)
-> (t m Char -> Stream m Char) -> t m Char -> Stream m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Char -> Stream m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# INLINE_NORMAL encodeUtf8D #-}
encodeUtf8D :: Monad m => Stream m Char -> Stream m Word8
encodeUtf8D :: Stream m Char -> Stream m Word8
encodeUtf8D = InvalidAction -> Stream m Char -> Stream m Word8
forall (m :: * -> *).
Monad m =>
InvalidAction -> Stream m Char -> Stream m Word8
encodeUtf8DGeneric InvalidAction
ReplaceInvalid
{-# INLINE encodeUtf8 #-}
encodeUtf8 :: (Monad m, IsStream t) => t m Char -> t m Word8
encodeUtf8 :: t m Char -> t m Word8
encodeUtf8 = Stream m Word8 -> t m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Word8 -> t m Word8)
-> (t m Char -> Stream m Word8) -> t m Char -> t m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m Char -> Stream m Word8
forall (m :: * -> *). Monad m => Stream m Char -> Stream m Word8
encodeUtf8D (Stream m Char -> Stream m Word8)
-> (t m Char -> Stream m Char) -> t m Char -> Stream m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Char -> Stream m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# INLINE_NORMAL encodeUtf8D_ #-}
encodeUtf8D_ :: Monad m => Stream m Char -> Stream m Word8
encodeUtf8D_ :: Stream m Char -> Stream m Word8
encodeUtf8D_ = InvalidAction -> Stream m Char -> Stream m Word8
forall (m :: * -> *).
Monad m =>
InvalidAction -> Stream m Char -> Stream m Word8
encodeUtf8DGeneric InvalidAction
DropInvalid
{-# INLINE encodeUtf8_ #-}
encodeUtf8_ :: (Monad m, IsStream t) => t m Char -> t m Word8
encodeUtf8_ :: t m Char -> t m Word8
encodeUtf8_ = Stream m Word8 -> t m Word8
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
Stream m a -> t m a
fromStreamD (Stream m Word8 -> t m Word8)
-> (t m Char -> Stream m Word8) -> t m Char -> t m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stream m Char -> Stream m Word8
forall (m :: * -> *). Monad m => Stream m Char -> Stream m Word8
encodeUtf8D_ (Stream m Char -> Stream m Word8)
-> (t m Char -> Stream m Char) -> t m Char -> Stream m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m Char -> Stream m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
t m a -> Stream m a
toStreamD
{-# DEPRECATED encodeUtf8Lax "Please use 'encodeUtf8' instead" #-}
{-# INLINE encodeUtf8Lax #-}
encodeUtf8Lax :: (IsStream t, Monad m) => t m Char -> t m Word8
encodeUtf8Lax :: t m Char -> t m Word8
encodeUtf8Lax = t m Char -> t m Word8
forall (m :: * -> *) (t :: (* -> *) -> * -> *).
(Monad m, IsStream t) =>
t m Char -> t m Word8
encodeUtf8
{-# INLINE encodeObject #-}
encodeObject :: MonadIO m =>
(SerialT m Char -> SerialT m Word8)
-> Unfold m a Char
-> a
-> m (Array Word8)
encodeObject :: (SerialT m Char -> SerialT m Word8)
-> Unfold m a Char -> a -> m (Array Word8)
encodeObject SerialT m Char -> SerialT m Word8
encode Unfold m a Char
u = Fold m Word8 (Array Word8) -> SerialT m Word8 -> m (Array Word8)
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> SerialT m a -> m b
S.fold Fold m Word8 (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, Storable a) =>
Fold m a (Array a)
Array.write (SerialT m Word8 -> m (Array Word8))
-> (a -> SerialT m Word8) -> a -> m (Array Word8)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SerialT m Char -> SerialT m Word8
encode (SerialT m Char -> SerialT m Word8)
-> (a -> SerialT m Char) -> a -> SerialT m Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Unfold m a Char -> a -> SerialT m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(IsStream t, Monad m) =>
Unfold m a b -> a -> t m b
S.unfold Unfold m a Char
u
{-# INLINE encodeObjects #-}
encodeObjects :: (MonadIO m, IsStream t) =>
(SerialT m Char -> SerialT m Word8)
-> Unfold m a Char
-> t m a
-> t m (Array Word8)
encodeObjects :: (SerialT m Char -> SerialT m Word8)
-> Unfold m a Char -> t m a -> t m (Array Word8)
encodeObjects SerialT m Char -> SerialT m Word8
encode Unfold m a Char
u = SerialT m (Array Word8) -> t m (Array Word8)
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
(IsStream t1, IsStream t2) =>
t1 m a -> t2 m a
adapt (SerialT m (Array Word8) -> t m (Array Word8))
-> (t m a -> SerialT m (Array Word8)) -> t m a -> t m (Array Word8)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m (Array Word8)) -> SerialT m a -> SerialT m (Array Word8)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SerialT m a -> SerialT m b
Serial.mapM ((SerialT m Char -> SerialT m Word8)
-> Unfold m a Char -> a -> m (Array Word8)
forall (m :: * -> *) a.
MonadIO m =>
(SerialT m Char -> SerialT m Word8)
-> Unfold m a Char -> a -> m (Array Word8)
encodeObject SerialT m Char -> SerialT m Word8
encode Unfold m a Char
u) (SerialT m a -> SerialT m (Array Word8))
-> (t m a -> SerialT m a) -> t m a -> SerialT m (Array Word8)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t m a -> SerialT m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
(IsStream t1, IsStream t2) =>
t1 m a -> t2 m a
adapt
{-# INLINE encodeStrings #-}
encodeStrings :: (MonadIO m, IsStream t) =>
(SerialT m Char -> SerialT m Word8) -> t m String -> t m (Array Word8)
encodeStrings :: (SerialT m Char -> SerialT m Word8)
-> t m [Char] -> t m (Array Word8)
encodeStrings SerialT m Char -> SerialT m Word8
encode = (SerialT m Char -> SerialT m Word8)
-> Unfold m [Char] Char -> t m [Char] -> t m (Array Word8)
forall (m :: * -> *) (t :: (* -> *) -> * -> *) a.
(MonadIO m, IsStream t) =>
(SerialT m Char -> SerialT m Word8)
-> Unfold m a Char -> t m a -> t m (Array Word8)
encodeObjects SerialT m Char -> SerialT m Word8
encode Unfold m [Char] Char
forall (m :: * -> *) a. Monad m => Unfold m [a] a
Unfold.fromList
{-# INLINE stripHead #-}
stripHead :: (Monad m, IsStream t) => t m Char -> t m Char
stripHead :: t m Char -> t m Char
stripHead = (Char -> Bool) -> t m Char -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(IsStream t, Monad m) =>
(a -> Bool) -> t m a -> t m a
S.dropWhile Char -> Bool
isSpace
{-# INLINE lines #-}
lines :: (Monad m, IsStream t) => Fold m Char b -> t m Char -> t m b
lines :: Fold m Char b -> t m Char -> t m b
lines = (Char -> Bool) -> Fold m Char b -> t m Char -> t m b
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(IsStream t, Monad m) =>
(a -> Bool) -> Fold m a b -> t m a -> t m b
S.splitOnSuffix (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\n')
foreign import ccall unsafe "u_iswspace"
iswspace :: Int -> Int
{-# INLINE isSpace #-}
isSpace :: Char -> Bool
isSpace :: Char -> Bool
isSpace Char
c
| Word
uc Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
0x377 = Word
uc Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
32 Bool -> Bool -> Bool
|| Word
uc Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
0x9 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
4 Bool -> Bool -> Bool
|| Word
uc Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0xa0
| Bool
otherwise = Int -> Int
iswspace (Char -> Int
ord Char
c) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
0
where
uc :: Word
uc = Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
c) :: Word
{-# INLINE words #-}
words :: (Monad m, IsStream t) => Fold m Char b -> t m Char -> t m b
words :: Fold m Char b -> t m Char -> t m b
words = (Char -> Bool) -> Fold m Char b -> t m Char -> t m b
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(IsStream t, Monad m) =>
(a -> Bool) -> Fold m a b -> t m a -> t m b
S.wordsBy Char -> Bool
isSpace
{-# INLINE unlines #-}
unlines :: (MonadIO m, IsStream t) => Unfold m a Char -> t m a -> t m Char
unlines :: Unfold m a Char -> t m a -> t m Char
unlines = Char -> Unfold m a Char -> t m a -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) c b.
(IsStream t, Monad m) =>
c -> Unfold m b c -> t m b -> t m c
S.interposeSuffix Char
'\n'
{-# INLINE unwords #-}
unwords :: (MonadIO m, IsStream t) => Unfold m a Char -> t m a -> t m Char
unwords :: Unfold m a Char -> t m a -> t m Char
unwords = Char -> Unfold m a Char -> t m a -> t m Char
forall (t :: (* -> *) -> * -> *) (m :: * -> *) c b.
(IsStream t, Monad m) =>
c -> Unfold m b c -> t m b -> t m c
S.interpose Char
' '