{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Test.Ouroboros.Consensus.ChainGenerator.Counting (
Count (Count)
, forgetBase
, forgetElem
, getCount
, (+)
, (-)
, Index
, Preds
, Size
, Total
, forRange_
, lastIndex
, range
, uniformIndex
, Contains (Contains, UnsafeContains)
, Lbl (Lbl)
, SomeWindow (SomeWindow)
, Win
, forgetWindow
, fromWindow
, fromWindowVar
, joinWin
, toWindow
, toWindowVar
, truncateWin
, windowLast
, windowSize
, windowStart
, withSuffixWindow
, withTopWindow
, withWindow
, withWindowBetween
, MVector (MVector)
, Vector (Vector)
, createV
, getMVector
, getVector
, lengthMV
, lengthV
, modifyMV
, readMV
, readV
, replicateMV
, sliceMV
, sliceV
, unsafeThawV
, writeMV
, Other
, Var
, joinVar
, toIndex
, toSize
, toVar
) where
import Control.Monad.ST (ST)
import Data.Coerce (coerce)
import Data.Foldable (for_)
import Data.Kind (Type)
import Data.Proxy (Proxy (Proxy))
import qualified Data.Type.Equality as TypeEq
import qualified Data.Vector.Unboxed as V
import qualified Data.Vector.Unboxed.Mutable as MV
import GHC.OverloadedLabels (IsLabel (fromLabel))
import Prelude hiding ((+), (-))
import qualified Prelude
import qualified System.Random.Stateful as R
import qualified Test.Ouroboros.Consensus.ChainGenerator.Some as Some
import qualified Test.QuickCheck as QC
infixl 6 .+, .-
(.+) :: Int -> Int -> Int
.+ :: Int -> Int -> Int
(.+) = Int -> Int -> Int
forall a. Num a => a -> a -> a
(Prelude.+)
(.-) :: Int -> Int -> Int
.- :: Int -> Int -> Int
(.-) = Int -> Int -> Int
forall a. Num a => a -> a -> a
(Prelude.-)
newtype Count (base :: Type) (elem :: kelem) (which :: kwhich) = Count Int
deriving (Gen (Count base elem which)
Gen (Count base elem which)
-> (Count base elem which -> [Count base elem which])
-> Arbitrary (Count base elem which)
Count base elem which -> [Count base elem which]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Gen (Count base elem which)
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> [Count base elem which]
$carbitrary :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Gen (Count base elem which)
arbitrary :: Gen (Count base elem which)
$cshrink :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> [Count base elem which]
shrink :: Count base elem which -> [Count base elem which]
QC.Arbitrary, Count base elem which -> Count base elem which -> Bool
(Count base elem which -> Count base elem which -> Bool)
-> (Count base elem which -> Count base elem which -> Bool)
-> Eq (Count base elem which)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
$c== :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
== :: Count base elem which -> Count base elem which -> Bool
$c/= :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
/= :: Count base elem which -> Count base elem which -> Bool
Eq, Eq (Count base elem which)
Eq (Count base elem which) =>
(Count base elem which -> Count base elem which -> Ordering)
-> (Count base elem which -> Count base elem which -> Bool)
-> (Count base elem which -> Count base elem which -> Bool)
-> (Count base elem which -> Count base elem which -> Bool)
-> (Count base elem which -> Count base elem which -> Bool)
-> (Count base elem which
-> Count base elem which -> Count base elem which)
-> (Count base elem which
-> Count base elem which -> Count base elem which)
-> Ord (Count base elem which)
Count base elem which -> Count base elem which -> Bool
Count base elem which -> Count base elem which -> Ordering
Count base elem which
-> Count base elem which -> Count base elem which
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 base kelem (elem :: kelem) kwhich (which :: kwhich).
Eq (Count base elem which)
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Ordering
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which
-> Count base elem which -> Count base elem which
$ccompare :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Ordering
compare :: Count base elem which -> Count base elem which -> Ordering
$c< :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
< :: Count base elem which -> Count base elem which -> Bool
$c<= :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
<= :: Count base elem which -> Count base elem which -> Bool
$c> :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
> :: Count base elem which -> Count base elem which -> Bool
$c>= :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> Count base elem which -> Bool
>= :: Count base elem which -> Count base elem which -> Bool
$cmax :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which
-> Count base elem which -> Count base elem which
max :: Count base elem which
-> Count base elem which -> Count base elem which
$cmin :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which
-> Count base elem which -> Count base elem which
min :: Count base elem which
-> Count base elem which -> Count base elem which
Ord, ReadPrec [Count base elem which]
ReadPrec (Count base elem which)
Int -> ReadS (Count base elem which)
ReadS [Count base elem which]
(Int -> ReadS (Count base elem which))
-> ReadS [Count base elem which]
-> ReadPrec (Count base elem which)
-> ReadPrec [Count base elem which]
-> Read (Count base elem which)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
ReadPrec [Count base elem which]
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
ReadPrec (Count base elem which)
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Int -> ReadS (Count base elem which)
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
ReadS [Count base elem which]
$creadsPrec :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Int -> ReadS (Count base elem which)
readsPrec :: Int -> ReadS (Count base elem which)
$creadList :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
ReadS [Count base elem which]
readList :: ReadS [Count base elem which]
$creadPrec :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
ReadPrec (Count base elem which)
readPrec :: ReadPrec (Count base elem which)
$creadListPrec :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
ReadPrec [Count base elem which]
readListPrec :: ReadPrec [Count base elem which]
Read, Int -> Count base elem which -> ShowS
[Count base elem which] -> ShowS
Count base elem which -> String
(Int -> Count base elem which -> ShowS)
-> (Count base elem which -> String)
-> ([Count base elem which] -> ShowS)
-> Show (Count base elem which)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Int -> Count base elem which -> ShowS
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
[Count base elem which] -> ShowS
forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> String
$cshowsPrec :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Int -> Count base elem which -> ShowS
showsPrec :: Int -> Count base elem which -> ShowS
$cshow :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
Count base elem which -> String
show :: Count base elem which -> String
$cshowList :: forall base kelem (elem :: kelem) kwhich (which :: kwhich).
[Count base elem which] -> ShowS
showList :: [Count base elem which] -> ShowS
Show)
getCount :: Count base elem which -> Int
getCount :: forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Int
getCount (Count Int
n) = Int
n
infixl 6 +, -
(+) :: Count base elem which -> Int -> Count base elem which
+ :: forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Int -> Count base elem which
(+) (Count Int
i) Int
j = Int -> Count base elem which
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int
i Int -> Int -> Int
.+ Int
j)
(-) :: Count base elem which -> Int -> Count base elem which
(-) (Count Int
i) Int
j = Int -> Count base elem which
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int
i Int -> Int -> Int
.- Int
j)
forgetBase :: Count base elem which -> Some.Forgotten (Count () elem which)
forgetBase :: forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Forgotten (Count () elem which)
forgetBase (Count Int
x) = Count () elem which -> Forgotten (Count () elem which)
forall a. a -> Forgotten a
Some.forgotten (Count () elem which -> Forgotten (Count () elem which))
-> Count () elem which -> Forgotten (Count () elem which)
forall a b. (a -> b) -> a -> b
$ Int -> Count () elem which
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
x
forgetElem :: Count base elem which -> Some.Forgotten (Count base () which)
forgetElem :: forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Forgotten (Count base () which)
forgetElem (Count Int
x) = Count base () which -> Forgotten (Count base () which)
forall a. a -> Forgotten a
Some.forgotten (Count base () which -> Forgotten (Count base () which))
-> Count base () which -> Forgotten (Count base () which)
forall a b. (a -> b) -> a -> b
$ Int -> Count base () which
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
x
data Preds
data Total
type Index base elem = Count base elem Preds
type Size base elem = Count base elem Total
lastIndex :: Size base elem -> Index base elem
lastIndex :: forall {kelem} base (elem :: kelem).
Size base elem -> Index base elem
lastIndex (Count Int
n) = Int -> Count base elem Preds
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int
n Int -> Int -> Int
.- Int
1)
range :: Size base elem -> [Index base elem]
range :: forall {kelem} base (elem :: kelem).
Size base elem -> [Index base elem]
range (Count Int
n) = [Int] -> [Index base elem]
forall a b. Coercible a b => a -> b
coerce [Int
0 .. Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 Int
n Int -> Int -> Int
.- Int
1]
forRange_ :: Applicative f => Size base elem -> (Index base elem -> f a) -> f ()
forRange_ :: forall {kelem} (f :: * -> *) base (elem :: kelem) a.
Applicative f =>
Size base elem -> (Index base elem -> f a) -> f ()
forRange_ Size base elem
c = [Index base elem] -> (Index base elem -> f a) -> f ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Size base elem -> [Index base elem]
forall {kelem} base (elem :: kelem).
Size base elem -> [Index base elem]
range Size base elem
c)
uniformIndex :: R.StatefulGen g m => Size base elem -> g -> m (Index base elem)
uniformIndex :: forall {kelem} g (m :: * -> *) base (elem :: kelem).
StatefulGen g m =>
Size base elem -> g -> m (Index base elem)
uniformIndex Size base elem
n g
g = Int -> Count base elem Preds
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int -> Count base elem Preds)
-> m Int -> m (Count base elem Preds)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int) -> g -> m Int
forall a g (m :: * -> *).
(UniformRange a, StatefulGen g m) =>
(a, a) -> g -> m a
forall g (m :: * -> *). StatefulGen g m => (Int, Int) -> g -> m Int
R.uniformRM (Int
0, Count base elem Preds -> Int
forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Int
getCount (Count base elem Preds -> Int) -> Count base elem Preds -> Int
forall a b. (a -> b) -> a -> b
$ Size base elem -> Count base elem Preds
forall {kelem} base (elem :: kelem).
Size base elem -> Index base elem
lastIndex Size base elem
n) g
g
data Lbl lbl = Lbl
instance (lbl TypeEq.~~ s) => IsLabel s (Lbl lbl) where fromLabel :: Lbl lbl
fromLabel = Lbl lbl
forall {k} (lbl :: k). Lbl lbl
Lbl
data Win (lbl :: klbl) (skolem :: Type)
data Contains (elem :: kelem) (outer :: Type) (inner :: Type) =
UnsafeContains
!(Index outer elem)
!(Size inner elem)
deriving (Contains elem outer inner -> Contains elem outer inner -> Bool
(Contains elem outer inner -> Contains elem outer inner -> Bool)
-> (Contains elem outer inner -> Contains elem outer inner -> Bool)
-> Eq (Contains elem outer inner)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall kelem (elem :: kelem) outer inner.
Contains elem outer inner -> Contains elem outer inner -> Bool
$c== :: forall kelem (elem :: kelem) outer inner.
Contains elem outer inner -> Contains elem outer inner -> Bool
== :: Contains elem outer inner -> Contains elem outer inner -> Bool
$c/= :: forall kelem (elem :: kelem) outer inner.
Contains elem outer inner -> Contains elem outer inner -> Bool
/= :: Contains elem outer inner -> Contains elem outer inner -> Bool
Eq, ReadPrec [Contains elem outer inner]
ReadPrec (Contains elem outer inner)
Int -> ReadS (Contains elem outer inner)
ReadS [Contains elem outer inner]
(Int -> ReadS (Contains elem outer inner))
-> ReadS [Contains elem outer inner]
-> ReadPrec (Contains elem outer inner)
-> ReadPrec [Contains elem outer inner]
-> Read (Contains elem outer inner)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall kelem (elem :: kelem) outer inner.
ReadPrec [Contains elem outer inner]
forall kelem (elem :: kelem) outer inner.
ReadPrec (Contains elem outer inner)
forall kelem (elem :: kelem) outer inner.
Int -> ReadS (Contains elem outer inner)
forall kelem (elem :: kelem) outer inner.
ReadS [Contains elem outer inner]
$creadsPrec :: forall kelem (elem :: kelem) outer inner.
Int -> ReadS (Contains elem outer inner)
readsPrec :: Int -> ReadS (Contains elem outer inner)
$creadList :: forall kelem (elem :: kelem) outer inner.
ReadS [Contains elem outer inner]
readList :: ReadS [Contains elem outer inner]
$creadPrec :: forall kelem (elem :: kelem) outer inner.
ReadPrec (Contains elem outer inner)
readPrec :: ReadPrec (Contains elem outer inner)
$creadListPrec :: forall kelem (elem :: kelem) outer inner.
ReadPrec [Contains elem outer inner]
readListPrec :: ReadPrec [Contains elem outer inner]
Read, Int -> Contains elem outer inner -> ShowS
[Contains elem outer inner] -> ShowS
Contains elem outer inner -> String
(Int -> Contains elem outer inner -> ShowS)
-> (Contains elem outer inner -> String)
-> ([Contains elem outer inner] -> ShowS)
-> Show (Contains elem outer inner)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall kelem (elem :: kelem) outer inner.
Int -> Contains elem outer inner -> ShowS
forall kelem (elem :: kelem) outer inner.
[Contains elem outer inner] -> ShowS
forall kelem (elem :: kelem) outer inner.
Contains elem outer inner -> String
$cshowsPrec :: forall kelem (elem :: kelem) outer inner.
Int -> Contains elem outer inner -> ShowS
showsPrec :: Int -> Contains elem outer inner -> ShowS
$cshow :: forall kelem (elem :: kelem) outer inner.
Contains elem outer inner -> String
show :: Contains elem outer inner -> String
$cshowList :: forall kelem (elem :: kelem) outer inner.
[Contains elem outer inner] -> ShowS
showList :: [Contains elem outer inner] -> ShowS
Show)
pattern Contains :: Index outer elem -> Size inner elem -> Contains elem outer inner
pattern $mContains :: forall {r} {kelem} {outer} {elem :: kelem} {inner}.
Contains elem outer inner
-> (Index outer elem -> Size inner elem -> r) -> ((# #) -> r) -> r
Contains x y <- UnsafeContains x y
{-# COMPLETE Contains #-}
forgetWindow :: Contains elem outer inner -> Some.Forgotten (Index outer elem, Index outer elem)
forgetWindow :: forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner
-> Forgotten (Index outer elem, Index outer elem)
forgetWindow Contains elem outer inner
win = (Index outer elem, Index outer elem)
-> Forgotten (Index outer elem, Index outer elem)
forall a. a -> Forgotten a
Some.forgotten (Contains elem outer inner -> Index outer elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index outer elem
windowStart Contains elem outer inner
win, Contains elem outer inner -> Index outer elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index outer elem
windowLast Contains elem outer inner
win)
fromWindow :: Contains elem outer inner -> Index inner elem -> Index outer elem
fromWindow :: forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index inner elem -> Index outer elem
fromWindow (Contains (Count Int
i) Size inner elem
_n) (Count Int
j) = Int -> Count outer elem Preds
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int
i Int -> Int -> Int
.+ Int
j)
fromWindowVar :: Contains elem outer inner -> Var inner x -> Var outer x
fromWindowVar :: forall {kelem} {kelem} (elem :: kelem) outer inner (x :: kelem).
Contains elem outer inner -> Var inner x -> Var outer x
fromWindowVar Contains elem outer inner
_ (Count Int
x) = Int -> Count outer x Other
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
x
toWindow :: Contains elem outer inner -> Index outer elem -> Maybe (Index inner elem)
{-# INLINE toWindow #-}
toWindow :: forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner
-> Index outer elem -> Maybe (Index inner elem)
toWindow (Contains (Count Int
i) (Count Int
n)) (Count Int
j) = if Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
j Bool -> Bool -> Bool
&& Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
i Int -> Int -> Int
.+ Int
n then Index inner elem -> Maybe (Index inner elem)
forall a. a -> Maybe a
Just (Int -> Index inner elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int
j Int -> Int -> Int
.- Int
i)) else Maybe (Index inner elem)
forall a. Maybe a
Nothing
toWindowVar :: Contains elem outer inner -> Var outer x -> Var inner x
toWindowVar :: forall {kelem} {kelem} (elem :: kelem) outer inner (x :: kelem).
Contains elem outer inner -> Var outer x -> Var inner x
toWindowVar Contains elem outer inner
_ (Count Int
x) = Int -> Count inner x Other
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
x
windowSize :: Contains elem outer inner -> Size inner elem
windowSize :: forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Size inner elem
windowSize (Contains Index outer elem
_i (Count Int
n)) = Int -> Count inner elem Total
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
n
windowStart :: Contains elem outer inner -> Index outer elem
windowStart :: forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index outer elem
windowStart Contains elem outer inner
win = Contains elem outer inner -> Index inner elem -> Index outer elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index inner elem -> Index outer elem
fromWindow Contains elem outer inner
win (Int -> Index inner elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
0)
windowLast :: Contains elem outer inner -> Index outer elem
windowLast :: forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index outer elem
windowLast Contains elem outer inner
win = Contains elem outer inner -> Index inner elem -> Index outer elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index inner elem -> Index outer elem
fromWindow Contains elem outer inner
win (Index inner elem -> Index outer elem)
-> Index inner elem -> Index outer elem
forall a b. (a -> b) -> a -> b
$ Size inner elem -> Index inner elem
forall {kelem} base (elem :: kelem).
Size base elem -> Index base elem
lastIndex (Size inner elem -> Index inner elem)
-> Size inner elem -> Index inner elem
forall a b. (a -> b) -> a -> b
$ Contains elem outer inner -> Size inner elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Size inner elem
windowSize Contains elem outer inner
win
truncateWin :: Contains elem outer inner -> Size inner elem -> Contains elem outer inner
truncateWin :: forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner
-> Size inner elem -> Contains elem outer inner
truncateWin (UnsafeContains Index outer elem
start Size inner elem
len) Size inner elem
x = Index outer elem -> Size inner elem -> Contains elem outer inner
forall kelem (elem :: kelem) outer inner.
Index outer elem -> Size inner elem -> Contains elem outer inner
UnsafeContains Index outer elem
start (Size inner elem -> Size inner elem -> Size inner elem
forall a. Ord a => a -> a -> a
min Size inner elem
len Size inner elem
x)
joinWin :: Contains elem outer mid -> Contains elem mid inner -> Contains elem outer inner
{-# INLINE joinWin #-}
joinWin :: forall {kelem} (elem :: kelem) outer mid inner.
Contains elem outer mid
-> Contains elem mid inner -> Contains elem outer inner
joinWin Contains elem outer mid
win Contains elem mid inner
win2 = Index outer elem -> Size inner elem -> Contains elem outer inner
forall kelem (elem :: kelem) outer inner.
Index outer elem -> Size inner elem -> Contains elem outer inner
UnsafeContains (Contains elem outer mid -> Index mid elem -> Index outer elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index inner elem -> Index outer elem
fromWindow Contains elem outer mid
win (Index mid elem -> Index outer elem)
-> Index mid elem -> Index outer elem
forall a b. (a -> b) -> a -> b
$ Contains elem mid inner -> Index mid elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index outer elem
windowStart Contains elem mid inner
win2) (Contains elem mid inner -> Size inner elem
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Size inner elem
windowSize Contains elem mid inner
win2)
data SomeWindow (lbl :: klbl) (outer :: Type) (elem :: kelem) =
forall (skolem :: Type).
SomeWindow
!(Proxy skolem)
!(Contains elem outer (Win lbl skolem))
instance Eq (SomeWindow lbl outer elem) where
SomeWindow Proxy skolem
_l1 Contains elem outer (Win lbl skolem)
l2 == :: SomeWindow lbl outer elem -> SomeWindow lbl outer elem -> Bool
== SomeWindow Proxy skolem
_r1 Contains elem outer (Win lbl skolem)
r2 =
Contains elem outer (Win lbl skolem)
-> Forgotten (Index outer elem, Index outer elem)
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner
-> Forgotten (Index outer elem, Index outer elem)
forgetWindow Contains elem outer (Win lbl skolem)
l2 Forgotten (Index outer elem, Index outer elem)
-> Forgotten (Index outer elem, Index outer elem) -> Bool
forall a. Eq a => a -> a -> Bool
== Contains elem outer (Win lbl skolem)
-> Forgotten (Index outer elem, Index outer elem)
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner
-> Forgotten (Index outer elem, Index outer elem)
forgetWindow Contains elem outer (Win lbl skolem)
r2
instance Show (SomeWindow lbl outer elem) where
showsPrec :: Int -> SomeWindow lbl outer elem -> ShowS
showsPrec Int
p (SomeWindow Proxy skolem
prx Contains elem outer (Win lbl skolem)
win) =
Int -> ShowBuilder (SomeWindow lbl outer elem) -> ShowS
forall a.
NoFun "runShowsPrec" a (AbsError "runShowsPrec" a) =>
Int -> ShowBuilder a -> ShowS
Some.runShowsPrec Int
p
(ShowBuilder (SomeWindow lbl outer elem) -> ShowS)
-> ShowBuilder (SomeWindow lbl outer elem) -> ShowS
forall a b. (a -> b) -> a -> b
$ (Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem)
-> String
-> ShowBuilder
(Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem)
forall a. a -> String -> ShowBuilder a
Some.showCtor Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem
forall klbl kelem (lbl :: klbl) outer (elem :: kelem) skolem.
Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem
SomeWindow String
"SomeWindow"
ShowBuilder
(Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem)
-> Proxy skolem
-> ShowBuilder
(Contains elem outer (Win lbl skolem) -> SomeWindow lbl outer elem)
forall a b. Show a => ShowBuilder (a -> b) -> a -> ShowBuilder b
`Some.showArg` Proxy skolem
prx
ShowBuilder
(Contains elem outer (Win lbl skolem) -> SomeWindow lbl outer elem)
-> Contains elem outer (Win lbl skolem)
-> ShowBuilder (SomeWindow lbl outer elem)
forall a b. Show a => ShowBuilder (a -> b) -> a -> ShowBuilder b
`Some.showArg` Contains elem outer (Win lbl skolem)
win
instance Read (SomeWindow lbl outer elem) where
readPrec :: ReadPrec (SomeWindow lbl outer elem)
readPrec =
ReadBuilder (SomeWindow lbl outer elem)
-> ReadPrec (SomeWindow lbl outer elem)
forall a.
NoFun "runReadPrec" a (AbsError "runReadPrec" a) =>
ReadBuilder a -> ReadPrec a
Some.runReadPrec
(ReadBuilder (SomeWindow lbl outer elem)
-> ReadPrec (SomeWindow lbl outer elem))
-> ReadBuilder (SomeWindow lbl outer elem)
-> ReadPrec (SomeWindow lbl outer elem)
forall a b. (a -> b) -> a -> b
$ (Proxy Any
-> Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem)
-> String
-> ReadBuilder
(Proxy Any
-> Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem)
forall a. a -> String -> ReadBuilder a
Some.readCtor Proxy Any
-> Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem
forall klbl kelem (lbl :: klbl) outer (elem :: kelem) skolem.
Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem
SomeWindow String
"SomeWindow"
ReadBuilder
(Proxy Any
-> Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem)
-> ReadBuilder (Proxy Any)
-> ReadBuilder
(Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem)
forall a b. ReadBuilder (a -> b) -> ReadBuilder a -> ReadBuilder b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBuilder (Proxy Any)
forall a. Read a => ReadBuilder a
Some.readArg
ReadBuilder
(Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem)
-> ReadBuilder (Contains elem outer (Win lbl Any))
-> ReadBuilder (SomeWindow lbl outer elem)
forall a b. ReadBuilder (a -> b) -> ReadBuilder a -> ReadBuilder b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBuilder (Contains elem outer (Win lbl Any))
forall a. Read a => ReadBuilder a
Some.readArg
withWindow :: Size outer elem -> Lbl lbl -> Index outer elem -> Size x elem -> SomeWindow lbl outer elem
withWindow :: forall {kelem} {klbl} outer (elem :: kelem) (lbl :: klbl) x.
Size outer elem
-> Lbl lbl
-> Index outer elem
-> Size x elem
-> SomeWindow lbl outer elem
withWindow (Count Int
n) Lbl lbl
_lbl (Count Int
i) (Count Int
m) =
Proxy Any
-> Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem
forall klbl kelem (lbl :: klbl) outer (elem :: kelem) skolem.
Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem
SomeWindow Proxy Any
forall {k} (t :: k). Proxy t
Proxy (Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem)
-> Contains elem outer (Win lbl Any) -> SomeWindow lbl outer elem
forall a b. (a -> b) -> a -> b
$ Count outer elem Preds
-> Size (Win lbl Any) elem -> Contains elem outer (Win lbl Any)
forall kelem (elem :: kelem) outer inner.
Index outer elem -> Size inner elem -> Contains elem outer inner
UnsafeContains (Int -> Count outer elem Preds
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
i') (Int -> Size (Win lbl Any) elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
m')
where
i' :: Int
i' = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
n (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 Int
i)
precedingElements :: Int
precedingElements = Int
i' Int -> Int -> Int
.- Int
i
trailingElements :: Int
trailingElements = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
i Int -> Int -> Int
.+ Int
m Int -> Int -> Int
.- Int
n
m' :: Int
m' = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
m Int -> Int -> Int
.- Int
precedingElements Int -> Int -> Int
.- Int
trailingElements
withWindowBetween :: Size outer elem -> Lbl lbl -> Index outer elem -> Index outer elem -> SomeWindow lbl outer elem
withWindowBetween :: forall {kelem} {klbl} outer (elem :: kelem) (lbl :: klbl).
Size outer elem
-> Lbl lbl
-> Index outer elem
-> Index outer elem
-> SomeWindow lbl outer elem
withWindowBetween Size outer elem
n Lbl lbl
lbl (Count Int
i) (Count Int
j) = Size outer elem
-> Lbl lbl
-> Count outer elem Preds
-> Size Any elem
-> SomeWindow lbl outer elem
forall {kelem} {klbl} outer (elem :: kelem) (lbl :: klbl) x.
Size outer elem
-> Lbl lbl
-> Index outer elem
-> Size x elem
-> SomeWindow lbl outer elem
withWindow Size outer elem
n Lbl lbl
lbl (Int -> Count outer elem Preds
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
i) (Int -> Size Any elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int -> Size Any elem) -> Int -> Size Any elem
forall a b. (a -> b) -> a -> b
$ Int
j Int -> Int -> Int
.- Int
i Int -> Int -> Int
.+ Int
1)
withSuffixWindow :: Size outer elem -> Lbl lbl -> Index outer elem -> SomeWindow lbl outer elem
withSuffixWindow :: forall {kelem} {klbl} outer (elem :: kelem) (lbl :: klbl).
Size outer elem
-> Lbl lbl -> Index outer elem -> SomeWindow lbl outer elem
withSuffixWindow Size outer elem
n Lbl lbl
lbl Index outer elem
i = Size outer elem
-> Lbl lbl
-> Index outer elem
-> Size Any elem
-> SomeWindow lbl outer elem
forall {kelem} {klbl} outer (elem :: kelem) (lbl :: klbl) x.
Size outer elem
-> Lbl lbl
-> Index outer elem
-> Size x elem
-> SomeWindow lbl outer elem
withWindow Size outer elem
n Lbl lbl
lbl Index outer elem
i (Int -> Size Any elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int -> Size Any elem) -> Int -> Size Any elem
forall a b. (a -> b) -> a -> b
$ Size outer elem -> Int
forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Int
getCount Size outer elem
n Int -> Int -> Int
.- Index outer elem -> Int
forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Int
getCount Index outer elem
i)
withTopWindow ::
Lbl lbl
-> Int
-> (forall base. Proxy base -> SomeWindow lbl base elem -> ans)
-> ans
withTopWindow :: forall {k} {k} (lbl :: k) (elem :: k) ans.
Lbl lbl
-> Int
-> (forall base. Proxy base -> SomeWindow lbl base elem -> ans)
-> ans
withTopWindow Lbl lbl
_lbl Int
n forall base. Proxy base -> SomeWindow lbl base elem -> ans
k =
Proxy Any -> SomeWindow lbl Any elem -> ans
forall base. Proxy base -> SomeWindow lbl base elem -> ans
k Proxy Any
forall {k} (t :: k). Proxy t
Proxy (SomeWindow lbl Any elem -> ans) -> SomeWindow lbl Any elem -> ans
forall a b. (a -> b) -> a -> b
$ Proxy Any
-> Contains elem Any (Win lbl Any) -> SomeWindow lbl Any elem
forall klbl kelem (lbl :: klbl) outer (elem :: kelem) skolem.
Proxy skolem
-> Contains elem outer (Win lbl skolem)
-> SomeWindow lbl outer elem
SomeWindow Proxy Any
forall {k} (t :: k). Proxy t
Proxy (Contains elem Any (Win lbl Any) -> SomeWindow lbl Any elem)
-> Contains elem Any (Win lbl Any) -> SomeWindow lbl Any elem
forall a b. (a -> b) -> a -> b
$ Index Any elem
-> Size (Win lbl Any) elem -> Contains elem Any (Win lbl Any)
forall kelem (elem :: kelem) outer inner.
Index outer elem -> Size inner elem -> Contains elem outer inner
UnsafeContains (Int -> Index Any elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
0) (Int -> Size (Win lbl Any) elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
n)
newtype Vector base elem a = Vector (V.Vector a)
deriving (Vector base elem a -> Vector base elem a -> Bool
(Vector base elem a -> Vector base elem a -> Bool)
-> (Vector base elem a -> Vector base elem a -> Bool)
-> Eq (Vector base elem a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k (base :: k) k (elem :: k) a.
(Unbox a, Eq a) =>
Vector base elem a -> Vector base elem a -> Bool
$c== :: forall k (base :: k) k (elem :: k) a.
(Unbox a, Eq a) =>
Vector base elem a -> Vector base elem a -> Bool
== :: Vector base elem a -> Vector base elem a -> Bool
$c/= :: forall k (base :: k) k (elem :: k) a.
(Unbox a, Eq a) =>
Vector base elem a -> Vector base elem a -> Bool
/= :: Vector base elem a -> Vector base elem a -> Bool
Eq, ReadPrec [Vector base elem a]
ReadPrec (Vector base elem a)
Int -> ReadS (Vector base elem a)
ReadS [Vector base elem a]
(Int -> ReadS (Vector base elem a))
-> ReadS [Vector base elem a]
-> ReadPrec (Vector base elem a)
-> ReadPrec [Vector base elem a]
-> Read (Vector base elem a)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
ReadPrec [Vector base elem a]
forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
ReadPrec (Vector base elem a)
forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
Int -> ReadS (Vector base elem a)
forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
ReadS [Vector base elem a]
$creadsPrec :: forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
Int -> ReadS (Vector base elem a)
readsPrec :: Int -> ReadS (Vector base elem a)
$creadList :: forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
ReadS [Vector base elem a]
readList :: ReadS [Vector base elem a]
$creadPrec :: forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
ReadPrec (Vector base elem a)
readPrec :: ReadPrec (Vector base elem a)
$creadListPrec :: forall k (base :: k) k (elem :: k) a.
(Read a, Unbox a) =>
ReadPrec [Vector base elem a]
readListPrec :: ReadPrec [Vector base elem a]
Read, Int -> Vector base elem a -> ShowS
[Vector base elem a] -> ShowS
Vector base elem a -> String
(Int -> Vector base elem a -> ShowS)
-> (Vector base elem a -> String)
-> ([Vector base elem a] -> ShowS)
-> Show (Vector base elem a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k (base :: k) k (elem :: k) a.
(Show a, Unbox a) =>
Int -> Vector base elem a -> ShowS
forall k (base :: k) k (elem :: k) a.
(Show a, Unbox a) =>
[Vector base elem a] -> ShowS
forall k (base :: k) k (elem :: k) a.
(Show a, Unbox a) =>
Vector base elem a -> String
$cshowsPrec :: forall k (base :: k) k (elem :: k) a.
(Show a, Unbox a) =>
Int -> Vector base elem a -> ShowS
showsPrec :: Int -> Vector base elem a -> ShowS
$cshow :: forall k (base :: k) k (elem :: k) a.
(Show a, Unbox a) =>
Vector base elem a -> String
show :: Vector base elem a -> String
$cshowList :: forall k (base :: k) k (elem :: k) a.
(Show a, Unbox a) =>
[Vector base elem a] -> ShowS
showList :: [Vector base elem a] -> ShowS
Show)
instance (QC.Arbitrary a, V.Unbox a) => QC.Arbitrary (Vector base elem a) where
arbitrary :: Gen (Vector base elem a)
arbitrary = (Vector a -> Vector base elem a
forall {k} {k} (base :: k) (elem :: k) a.
Vector a -> Vector base elem a
Vector (Vector a -> Vector base elem a)
-> ([a] -> Vector a) -> [a] -> Vector base elem a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Vector a
forall a. Unbox a => [a] -> Vector a
V.fromList) ([a] -> Vector base elem a) -> Gen [a] -> Gen (Vector base elem a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [a]
forall a. Arbitrary a => Gen a
QC.arbitrary
shrink :: Vector base elem a -> [Vector base elem a]
shrink = ([a] -> Vector base elem a) -> [[a]] -> [Vector base elem a]
forall a b. (a -> b) -> [a] -> [b]
map (Vector a -> Vector base elem a
forall {k} {k} (base :: k) (elem :: k) a.
Vector a -> Vector base elem a
Vector (Vector a -> Vector base elem a)
-> ([a] -> Vector a) -> [a] -> Vector base elem a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Vector a
forall a. Unbox a => [a] -> Vector a
V.fromList) ([[a]] -> [Vector base elem a])
-> (Vector base elem a -> [[a]])
-> Vector base elem a
-> [Vector base elem a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [[a]]
forall a. Arbitrary a => a -> [a]
QC.shrink ([a] -> [[a]])
-> (Vector base elem a -> [a]) -> Vector base elem a -> [[a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> [a]
forall a. Unbox a => Vector a -> [a]
V.toList (Vector a -> [a])
-> (Vector base elem a -> Vector a) -> Vector base elem a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector base elem a -> Vector a
forall {k} {k} (base :: k) (elem :: k) a.
Vector base elem a -> Vector a
getVector
getVector :: Vector base elem a -> V.Vector a
getVector :: forall {k} {k} (base :: k) (elem :: k) a.
Vector base elem a -> Vector a
getVector (Vector Vector a
v) = Vector a
v
lengthV :: V.Unbox a => Vector base elem a -> Size base elem
lengthV :: forall {kelem} a base (elem :: kelem).
Unbox a =>
Vector base elem a -> Size base elem
lengthV = Int -> Count base elem Total
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int -> Count base elem Total)
-> (Vector base elem a -> Int)
-> Vector base elem a
-> Count base elem Total
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> Int
forall a. Unbox a => Vector a -> Int
V.length (Vector a -> Int)
-> (Vector base elem a -> Vector a) -> Vector base elem a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector base elem a -> Vector a
forall {k} {k} (base :: k) (elem :: k) a.
Vector base elem a -> Vector a
getVector
sliceV :: MV.Unbox a => Contains elem outer inner -> Vector outer elem a -> Vector inner elem a
{-# INLINE sliceV #-}
sliceV :: forall {k} a (elem :: k) outer inner.
Unbox a =>
Contains elem outer inner
-> Vector outer elem a -> Vector inner elem a
sliceV Contains elem outer inner
win (Vector Vector a
v) =
Vector a -> Vector inner elem a
forall {k} {k} (base :: k) (elem :: k) a.
Vector a -> Vector base elem a
Vector (Vector a -> Vector inner elem a)
-> Vector a -> Vector inner elem a
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Vector a -> Vector a
forall a. Unbox a => Int -> Int -> Vector a -> Vector a
V.slice Int
i Int
n Vector a
v
where
Count Int
i = Contains elem outer inner
-> Index inner elem -> Count outer elem Preds
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index inner elem -> Index outer elem
fromWindow Contains elem outer inner
win (Int -> Index inner elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
0)
Count Int
n = Contains elem outer inner -> Count inner elem Total
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Size inner elem
windowSize Contains elem outer inner
win
unsafeThawV :: MV.Unbox a => Vector base elem a -> ST s (MVector base elem s a)
unsafeThawV :: forall {k} {k} a (base :: k) (elem :: k) s.
Unbox a =>
Vector base elem a -> ST s (MVector base elem s a)
unsafeThawV (Vector Vector a
v) = MVector s a -> MVector base elem s a
forall {k} {k} (base :: k) (elem :: k) s a.
MVector s a -> MVector base elem s a
MVector (MVector s a -> MVector base elem s a)
-> ST s (MVector s a) -> ST s (MVector base elem s a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vector a -> ST s (MVector (PrimState (ST s)) a)
forall a (m :: * -> *).
(Unbox a, PrimMonad m) =>
Vector a -> m (MVector (PrimState m) a)
V.unsafeThaw Vector a
v
createV :: MV.Unbox a => (forall s. ST s (MVector base elem s a)) -> Vector base elem a
createV :: forall {k} {k} a (base :: k) (elem :: k).
Unbox a =>
(forall s. ST s (MVector base elem s a)) -> Vector base elem a
createV forall s. ST s (MVector base elem s a)
m = Vector a -> Vector base elem a
forall {k} {k} (base :: k) (elem :: k) a.
Vector a -> Vector base elem a
Vector (Vector a -> Vector base elem a) -> Vector a -> Vector base elem a
forall a b. (a -> b) -> a -> b
$ (forall s. ST s (MVector s a)) -> Vector a
forall a. Unbox a => (forall s. ST s (MVector s a)) -> Vector a
V.create (MVector base elem s a -> MVector s a
forall {k} {k} (base :: k) (elem :: k) s a.
MVector base elem s a -> MVector s a
getMVector (MVector base elem s a -> MVector s a)
-> ST s (MVector base elem s a) -> ST s (MVector s a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ST s (MVector base elem s a)
forall s. ST s (MVector base elem s a)
m)
newtype MVector base elem s a = MVector (MV.MVector s a)
getMVector :: MVector base elem s a -> MV.MVector s a
getMVector :: forall {k} {k} (base :: k) (elem :: k) s a.
MVector base elem s a -> MVector s a
getMVector (MVector MVector s a
mv) = MVector s a
mv
lengthMV :: MV.Unbox a => MVector base elem s a -> Size base elem
lengthMV :: forall {kelem} a base (elem :: kelem) s.
Unbox a =>
MVector base elem s a -> Size base elem
lengthMV = Int -> Count base elem Total
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count (Int -> Count base elem Total)
-> (MVector base elem s a -> Int)
-> MVector base elem s a
-> Count base elem Total
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MVector s a -> Int
forall a s. Unbox a => MVector s a -> Int
MV.length (MVector s a -> Int)
-> (MVector base elem s a -> MVector s a)
-> MVector base elem s a
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MVector base elem s a -> MVector s a
forall {k} {k} (base :: k) (elem :: k) s a.
MVector base elem s a -> MVector s a
getMVector
sliceMV :: MV.Unbox a => Contains elem outer inner -> MVector outer elem s a -> MVector inner elem s a
{-# INLINE sliceMV #-}
sliceMV :: forall {k} a (elem :: k) outer inner s.
Unbox a =>
Contains elem outer inner
-> MVector outer elem s a -> MVector inner elem s a
sliceMV Contains elem outer inner
win (MVector MVector s a
mv) =
MVector s a -> MVector inner elem s a
forall {k} {k} (base :: k) (elem :: k) s a.
MVector s a -> MVector base elem s a
MVector (MVector s a -> MVector inner elem s a)
-> MVector s a -> MVector inner elem s a
forall a b. (a -> b) -> a -> b
$ Int -> Int -> MVector s a -> MVector s a
forall a s. Unbox a => Int -> Int -> MVector s a -> MVector s a
MV.slice Int
i Int
n MVector s a
mv
where
Count Int
i = Contains elem outer inner
-> Index inner elem -> Count outer elem Preds
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Index inner elem -> Index outer elem
fromWindow Contains elem outer inner
win (Int -> Index inner elem
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
0)
Count Int
n = Contains elem outer inner -> Count inner elem Total
forall {kelem} (elem :: kelem) outer inner.
Contains elem outer inner -> Size inner elem
windowSize Contains elem outer inner
win
replicateMV :: MV.Unbox a => Size base elem -> ST s a -> ST s (MVector base elem s a)
replicateMV :: forall {k} a base (elem :: k) s.
Unbox a =>
Size base elem -> ST s a -> ST s (MVector base elem s a)
replicateMV (Count Int
n) ST s a
m = (MVector s a -> MVector base elem s a)
-> ST s (MVector s a) -> ST s (MVector base elem s a)
forall a b. (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap MVector s a -> MVector base elem s a
forall {k} {k} (base :: k) (elem :: k) s a.
MVector s a -> MVector base elem s a
MVector (ST s (MVector s a) -> ST s (MVector base elem s a))
-> ST s (MVector s a) -> ST s (MVector base elem s a)
forall a b. (a -> b) -> a -> b
$ Int -> ST s a -> ST s (MVector (PrimState (ST s)) a)
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
Int -> m a -> m (MVector (PrimState m) a)
MV.replicateM Int
n ST s a
m
readMV :: MV.Unbox a => MVector base elem s a -> Index base elem -> ST s a
writeMV :: MV.Unbox a => MVector base elem s a -> Index base elem -> a -> ST s ()
modifyMV :: MV.Unbox a => MVector base elem s a -> (a -> a) -> Index base elem -> ST s ()
readMV :: forall {kelem} a base (elem :: kelem) s.
Unbox a =>
MVector base elem s a -> Index base elem -> ST s a
readMV (MVector MVector s a
mv) (Count Int
i) = MVector (PrimState (ST s)) a -> Int -> ST s a
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> Int -> m a
MV.read MVector s a
MVector (PrimState (ST s)) a
mv Int
i
writeMV :: forall {kelem} a base (elem :: kelem) s.
Unbox a =>
MVector base elem s a -> Index base elem -> a -> ST s ()
writeMV (MVector MVector s a
mv) (Count Int
i) a
x = MVector (PrimState (ST s)) a -> Int -> a -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> Int -> a -> m ()
MV.write MVector s a
MVector (PrimState (ST s)) a
mv Int
i a
x
modifyMV :: forall {kelem} a base (elem :: kelem) s.
Unbox a =>
MVector base elem s a -> (a -> a) -> Index base elem -> ST s ()
modifyMV (MVector MVector s a
mv) a -> a
f (Count Int
i) = MVector (PrimState (ST s)) a -> (a -> a) -> Int -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Unbox a) =>
MVector (PrimState m) a -> (a -> a) -> Int -> m ()
MV.modify MVector s a
MVector (PrimState (ST s)) a
mv a -> a
f Int
i
readV :: MV.Unbox a => Vector base elem a -> Index base elem -> a
readV :: forall {kelem} a base (elem :: kelem).
Unbox a =>
Vector base elem a -> Index base elem -> a
readV (Vector Vector a
v) (Count Int
i) = Vector a
v Vector a -> Int -> a
forall a. Unbox a => Vector a -> Int -> a
V.! Int
i
data Other
deriving instance (which TypeEq.~~ Other) => Enum (Count base elem which)
deriving instance (which TypeEq.~~ Other) => Num (Count base elem which)
type Var base elem = Count base elem Other
toVar :: Count base elem which -> Var base elem
toVar :: forall {kelem} {kwhich} base (elem :: kelem) (which :: kwhich).
Count base elem which -> Var base elem
toVar (Count Int
n) = Int -> Count base elem Other
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
n
toSize :: Var base elem -> Size base elem
toSize :: forall {kelem} base (elem :: kelem).
Var base elem -> Size base elem
toSize (Count Int
n) = Int -> Count base elem Total
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
n
toIndex :: Var base elem -> Index base elem
toIndex :: forall {kelem} base (elem :: kelem).
Var base elem -> Index base elem
toIndex (Count Int
i) = Int -> Count base elem Preds
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
i
joinVar :: MVector base elem s a -> Var a x -> Var base x
joinVar :: forall {k} {kelem} base (elem :: k) s a (x :: kelem).
MVector base elem s a -> Var a x -> Var base x
joinVar MVector base elem s a
_ = \(Count Int
n) -> Int -> Var base x
forall kelem kwhich base (elem :: kelem) (which :: kwhich).
Int -> Count base elem which
Count Int
n