quic-0.0.0: Network/QUIC/Stream/Frag.hs
module Network.QUIC.Stream.Frag where
import Data.Sequence (Seq, viewl, viewr, ViewL(..), ViewR(..), (<|), dropWhileL)
class Frag a where
currOff :: a -> Int
nextOff :: a -> Int
shrink :: Int -> a -> a
instance Frag a => Frag (Seq a) where
currOff s = case viewl s of
EmptyL -> error "Seq is empty (1)"
x :< _ -> currOff x
nextOff s = case viewr s of
EmptyR -> error "Seq is empty (2)"
_ :> x -> nextOff x
shrink = shrinkSeq
shrinkSeq :: Frag a => Int -> Seq a -> Seq a
shrinkSeq n s0 = case viewl s of
EmptyL -> error "shrinkSeq"
x :< xs
| nextOff x == n -> xs
| otherwise -> shrink n x <| xs
where
s = dropWhileL (\y -> not (currOff y <= n && n <= nextOff y)) s0
data F = F Int Int deriving Show
instance Frag F where
currOff (F s _) = s
nextOff (F _ e) = e
shrink n (F s e) = if s <= n && n <= e then F n e else error "shrink"