{-# LANGUAGE BangPatterns, ExistentialQuantification #-}
module Data.Text.Internal.Fusion.Types
(
CC(..)
, PairS(..)
, Scan(..)
, RS(..)
, Step(..)
, Stream(..)
, empty
) where
import Data.Text.Internal.Fusion.Size
import Data.Word (Word8)
data CC s = CC !s {-# UNPACK #-} !Char {-# UNPACK #-} !Char
data RS s
= RS0 !s
| RS1 !s {-# UNPACK #-} !Word8
| RS2 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
| RS3 !s {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8 {-# UNPACK #-} !Word8
data PairS a b = !a :*: !b
infixl 2 :*:
data Scan s = Scan1 {-# UNPACK #-} !Char !s
| Scan2 {-# UNPACK #-} !Char !s
data Step s a = Done
| Skip !s
| Yield !a !s
instance (Eq a) => Eq (Stream a) where
== :: Stream a -> Stream a -> Bool
(==) = Stream a -> Stream a -> Bool
forall a. Eq a => Stream a -> Stream a -> Bool
eq
instance (Ord a) => Ord (Stream a) where
compare :: Stream a -> Stream a -> Ordering
compare = Stream a -> Stream a -> Ordering
forall a. Ord a => Stream a -> Stream a -> Ordering
cmp
data Stream a =
forall s. Stream
(s -> Step s a)
!s
!Size
eq :: (Eq a) => Stream a -> Stream a -> Bool
eq :: Stream a -> Stream a -> Bool
eq (Stream next1 :: s -> Step s a
next1 s1 :: s
s1 _) (Stream next2 :: s -> Step s a
next2 s2 :: s
s2 _) = Step s a -> Step s a -> Bool
loop (s -> Step s a
next1 s
s1) (s -> Step s a
next2 s
s2)
where
loop :: Step s a -> Step s a -> Bool
loop Done Done = Bool
True
loop (Skip s1' :: s
s1') (Skip s2' :: s
s2') = Step s a -> Step s a -> Bool
loop (s -> Step s a
next1 s
s1') (s -> Step s a
next2 s
s2')
loop (Skip s1' :: s
s1') x2 :: Step s a
x2 = Step s a -> Step s a -> Bool
loop (s -> Step s a
next1 s
s1') Step s a
x2
loop x1 :: Step s a
x1 (Skip s2' :: s
s2') = Step s a -> Step s a -> Bool
loop Step s a
x1 (s -> Step s a
next2 s
s2')
loop Done _ = Bool
False
loop _ Done = Bool
False
loop (Yield x1 :: a
x1 s1' :: s
s1') (Yield x2 :: a
x2 s2' :: s
s2') = a
x1 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x2 Bool -> Bool -> Bool
&&
Step s a -> Step s a -> Bool
loop (s -> Step s a
next1 s
s1') (s -> Step s a
next2 s
s2')
{-# INLINE [0] eq #-}
cmp :: (Ord a) => Stream a -> Stream a -> Ordering
cmp :: Stream a -> Stream a -> Ordering
cmp (Stream next1 :: s -> Step s a
next1 s1 :: s
s1 _) (Stream next2 :: s -> Step s a
next2 s2 :: s
s2 _) = Step s a -> Step s a -> Ordering
loop (s -> Step s a
next1 s
s1) (s -> Step s a
next2 s
s2)
where
loop :: Step s a -> Step s a -> Ordering
loop Done Done = Ordering
EQ
loop (Skip s1' :: s
s1') (Skip s2' :: s
s2') = Step s a -> Step s a -> Ordering
loop (s -> Step s a
next1 s
s1') (s -> Step s a
next2 s
s2')
loop (Skip s1' :: s
s1') x2 :: Step s a
x2 = Step s a -> Step s a -> Ordering
loop (s -> Step s a
next1 s
s1') Step s a
x2
loop x1 :: Step s a
x1 (Skip s2' :: s
s2') = Step s a -> Step s a -> Ordering
loop Step s a
x1 (s -> Step s a
next2 s
s2')
loop Done _ = Ordering
LT
loop _ Done = Ordering
GT
loop (Yield x1 :: a
x1 s1' :: s
s1') (Yield x2 :: a
x2 s2' :: s
s2') =
case a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
x1 a
x2 of
EQ -> Step s a -> Step s a -> Ordering
loop (s -> Step s a
next1 s
s1') (s -> Step s a
next2 s
s2')
other :: Ordering
other -> Ordering
other
{-# INLINE [0] cmp #-}
empty :: Stream a
empty :: Stream a
empty = (() -> Step () a) -> () -> Size -> Stream a
forall a s. (s -> Step s a) -> s -> Size -> Stream a
Stream () -> Step () a
forall p s a. p -> Step s a
next () 0
where next :: p -> Step s a
next _ = Step s a
forall s a. Step s a
Done
{-# INLINE [0] empty #-}