module StreamPatch.Seek where

import Data.Kind
import GHC.Generics ( Generic )
import Data.Data ( Data )
import Data.Aeson

class Seek (s :: Type) where
    type SeekRep s :: Type
    unSeek :: s -> SeekRep s
    mkSeek :: SeekRep s -> s

-- | Seek to stream index. Relative to a base, which can either move during
--   patching (actual relative) or stay constant ("absolute"). We abstract over
--   the internal type to allow using natural types where we want to disallow
--   negatives, and possibly allow sized types for efficiency.
newtype SIx a = SIx { forall a. SIx a -> a
unSIx :: a }
    deriving stock (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (SIx a) x -> SIx a
forall a x. SIx a -> Rep (SIx a) x
$cto :: forall a x. Rep (SIx a) x -> SIx a
$cfrom :: forall a x. SIx a -> Rep (SIx a) x
Generic, SIx a -> DataType
SIx a -> Constr
forall {a}. Data a => Typeable (SIx a)
forall a. Data a => SIx a -> DataType
forall a. Data a => SIx a -> Constr
forall a. Data a => (forall b. Data b => b -> b) -> SIx a -> SIx a
forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> SIx a -> u
forall a u. Data a => (forall d. Data d => d -> u) -> SIx a -> [u]
forall a r r'.
Data a =>
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> SIx a -> r
forall a r r'.
Data a =>
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> SIx a -> r
forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SIx a)
forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SIx a -> c (SIx a)
forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (SIx a))
forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (SIx a))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SIx a)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SIx a -> c (SIx a)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (SIx a))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
$cgmapMo :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
$cgmapMp :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
$cgmapM :: forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> SIx a -> m (SIx a)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> SIx a -> u
$cgmapQi :: forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> SIx a -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> SIx a -> [u]
$cgmapQ :: forall a u. Data a => (forall d. Data d => d -> u) -> SIx a -> [u]
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> SIx a -> r
$cgmapQr :: forall a r r'.
Data a =>
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> SIx a -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> SIx a -> r
$cgmapQl :: forall a r r'.
Data a =>
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> SIx a -> r
gmapT :: (forall b. Data b => b -> b) -> SIx a -> SIx a
$cgmapT :: forall a. Data a => (forall b. Data b => b -> b) -> SIx a -> SIx a
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (SIx a))
$cdataCast2 :: forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (SIx a))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (SIx a))
$cdataCast1 :: forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (SIx a))
dataTypeOf :: SIx a -> DataType
$cdataTypeOf :: forall a. Data a => SIx a -> DataType
toConstr :: SIx a -> Constr
$ctoConstr :: forall a. Data a => SIx a -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SIx a)
$cgunfold :: forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SIx a)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SIx a -> c (SIx a)
$cgfoldl :: forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SIx a -> c (SIx a)
Data, Int -> SIx a -> ShowS
forall a. Show a => Int -> SIx a -> ShowS
forall a. Show a => [SIx a] -> ShowS
forall a. Show a => SIx a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SIx a] -> ShowS
$cshowList :: forall a. Show a => [SIx a] -> ShowS
show :: SIx a -> String
$cshow :: forall a. Show a => SIx a -> String
showsPrec :: Int -> SIx a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> SIx a -> ShowS
Show, SIx a -> SIx a -> Bool
forall a. Eq a => SIx a -> SIx a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SIx a -> SIx a -> Bool
$c/= :: forall a. Eq a => SIx a -> SIx a -> Bool
== :: SIx a -> SIx a -> Bool
$c== :: forall a. Eq a => SIx a -> SIx a -> Bool
Eq, SIx a -> SIx a -> Bool
SIx a -> SIx a -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (SIx a)
forall a. Ord a => SIx a -> SIx a -> Bool
forall a. Ord a => SIx a -> SIx a -> Ordering
forall a. Ord a => SIx a -> SIx a -> SIx a
min :: SIx a -> SIx a -> SIx a
$cmin :: forall a. Ord a => SIx a -> SIx a -> SIx a
max :: SIx a -> SIx a -> SIx a
$cmax :: forall a. Ord a => SIx a -> SIx a -> SIx a
>= :: SIx a -> SIx a -> Bool
$c>= :: forall a. Ord a => SIx a -> SIx a -> Bool
> :: SIx a -> SIx a -> Bool
$c> :: forall a. Ord a => SIx a -> SIx a -> Bool
<= :: SIx a -> SIx a -> Bool
$c<= :: forall a. Ord a => SIx a -> SIx a -> Bool
< :: SIx a -> SIx a -> Bool
$c< :: forall a. Ord a => SIx a -> SIx a -> Bool
compare :: SIx a -> SIx a -> Ordering
$ccompare :: forall a. Ord a => SIx a -> SIx a -> Ordering
Ord)
    deriving ([SIx a] -> Encoding
[SIx a] -> Value
SIx a -> Encoding
SIx a -> Value
forall a. ToJSON a => [SIx a] -> Encoding
forall a. ToJSON a => [SIx a] -> Value
forall a. ToJSON a => SIx a -> Encoding
forall a. ToJSON a => SIx a -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [SIx a] -> Encoding
$ctoEncodingList :: forall a. ToJSON a => [SIx a] -> Encoding
toJSONList :: [SIx a] -> Value
$ctoJSONList :: forall a. ToJSON a => [SIx a] -> Value
toEncoding :: SIx a -> Encoding
$ctoEncoding :: forall a. ToJSON a => SIx a -> Encoding
toJSON :: SIx a -> Value
$ctoJSON :: forall a. ToJSON a => SIx a -> Value
ToJSON, Value -> Parser [SIx a]
Value -> Parser (SIx a)
forall a. FromJSON a => Value -> Parser [SIx a]
forall a. FromJSON a => Value -> Parser (SIx a)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [SIx a]
$cparseJSONList :: forall a. FromJSON a => Value -> Parser [SIx a]
parseJSON :: Value -> Parser (SIx a)
$cparseJSON :: forall a. FromJSON a => Value -> Parser (SIx a)
FromJSON) via a