{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.Stack.Circular
(
MStack,
replicate,
fromVector,
fromVectorWithIndex,
toVector,
take,
size,
get,
pop,
push,
foldM,
foldKM,
Stack,
thaw,
freeze,
)
where
import Control.Monad.Primitive
import Data.Aeson
import Data.Aeson.TH
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Generic.Mutable as VM
import Prelude hiding (foldl, product, replicate, sum, take)
data MStack v s a = MStack
{ MStack v s a -> Mutable v s a
_mVector :: VG.Mutable v s a,
MStack v s a -> Int
_mIndex :: !Int
}
replicate :: (VG.Vector v a, PrimMonad m) => Int -> a -> m (MStack v (PrimState m) a)
replicate :: Int -> a -> m (MStack v (PrimState m) a)
replicate Int
n a
x
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = [Char] -> m (MStack v (PrimState m) a)
forall a. HasCallStack => [Char] -> a
error [Char]
"empty: maximum size must be one or larger"
| Bool
otherwise = do
Mutable v (PrimState m) a
v <- Int -> a -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> a -> m (v (PrimState m) a)
VM.replicate Int
n a
x
MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (MStack v (PrimState m) a -> m (MStack v (PrimState m) a))
-> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ Mutable v (PrimState m) a -> Int -> MStack v (PrimState m) a
forall (v :: * -> *) s a. Mutable v s a -> Int -> MStack v s a
MStack Mutable v (PrimState m) a
v Int
0
fromVector :: (VG.Vector v a, PrimMonad m) => v a -> m (MStack v (PrimState m) a)
fromVector :: v a -> m (MStack v (PrimState m) a)
fromVector v a
v
| Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = [Char] -> m (MStack v (PrimState m) a)
forall a. HasCallStack => [Char] -> a
error [Char]
"fromVector: empty vector"
| Bool
otherwise = do
Mutable v (PrimState m) a
mv <- v a -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.thaw v a
v
MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (MStack v (PrimState m) a -> m (MStack v (PrimState m) a))
-> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ Mutable v (PrimState m) a -> Int -> MStack v (PrimState m) a
forall (v :: * -> *) s a. Mutable v s a -> Int -> MStack v s a
MStack Mutable v (PrimState m) a
mv (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
where
n :: Int
n = v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
VG.length v a
v
fromVectorWithIndex :: (VG.Vector v a, PrimMonad m) => Int -> v a -> m (MStack v (PrimState m) a)
fromVectorWithIndex :: Int -> v a -> m (MStack v (PrimState m) a)
fromVectorWithIndex Int
i v a
v = do
MStack v (PrimState m) a
ms <- v a -> m (MStack v (PrimState m) a)
forall (v :: * -> *) a (m :: * -> *).
(Vector v a, PrimMonad m) =>
v a -> m (MStack v (PrimState m) a)
fromVector v a
v
MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (MStack v (PrimState m) a -> m (MStack v (PrimState m) a))
-> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ MStack v (PrimState m) a
ms {_mIndex :: Int
_mIndex = Int
i}
toVector :: (VG.Vector v a, PrimMonad m) => MStack v (PrimState m) a -> m (v a)
toVector :: MStack v (PrimState m) a -> m (v a)
toVector (MStack Mutable v (PrimState m) a
v Int
i) = do
v a
l <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze (Mutable v (PrimState m) a -> m (v a))
-> Mutable v (PrimState m) a -> m (v a)
forall a b. (a -> b) -> a -> b
$ Int -> Mutable v (PrimState m) a -> Mutable v (PrimState m) a
forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
VM.unsafeDrop Int
i' Mutable v (PrimState m) a
v
v a
r <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze (Mutable v (PrimState m) a -> m (v a))
-> Mutable v (PrimState m) a -> m (v a)
forall a b. (a -> b) -> a -> b
$ Int -> Mutable v (PrimState m) a -> Mutable v (PrimState m) a
forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
VM.unsafeTake Int
i' Mutable v (PrimState m) a
v
v a -> m (v a)
forall (m :: * -> *) a. Monad m => a -> m a
return (v a -> m (v a)) -> v a -> m (v a)
forall a b. (a -> b) -> a -> b
$ v a
l v a -> v a -> v a
forall (v :: * -> *) a. Vector v a => v a -> v a -> v a
VG.++ v a
r
where
i' :: Int
i' = Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
take :: (VG.Vector v a, PrimMonad m) => Int -> MStack v (PrimState m) a -> m (v a)
take :: Int -> MStack v (PrimState m) a -> m (v a)
take Int
k (MStack Mutable v (PrimState m) a
v Int
i)
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> m (v a)
forall a. HasCallStack => [Char] -> a
error [Char]
"toVectorN: negative k"
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
n = [Char] -> m (v a)
forall a. HasCallStack => [Char] -> a
error [Char]
"toVectorN: circular stack too small"
| Int
k Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = v a -> m (v a)
forall (m :: * -> *) a. Monad m => a -> m a
return v a
forall (v :: * -> *) a. Vector v a => v a
VG.empty
| Int
i0 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 = Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze (Mutable v (PrimState m) a -> m (v a))
-> Mutable v (PrimState m) a -> m (v a)
forall a b. (a -> b) -> a -> b
$ Int
-> Int -> Mutable v (PrimState m) a -> Mutable v (PrimState m) a
forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
VM.unsafeSlice Int
i0 Int
k Mutable v (PrimState m) a
v
| Bool
otherwise = do
v a
r <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze (Mutable v (PrimState m) a -> m (v a))
-> Mutable v (PrimState m) a -> m (v a)
forall a b. (a -> b) -> a -> b
$ Int -> Mutable v (PrimState m) a -> Mutable v (PrimState m) a
forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
VM.unsafeTake Int
i' Mutable v (PrimState m) a
v
v a
l <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze (Mutable v (PrimState m) a -> m (v a))
-> Mutable v (PrimState m) a -> m (v a)
forall a b. (a -> b) -> a -> b
$ Int -> Mutable v (PrimState m) a -> Mutable v (PrimState m) a
forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
VM.unsafeDrop (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
i0) Mutable v (PrimState m) a
v
v a -> m (v a)
forall (m :: * -> *) a. Monad m => a -> m a
return (v a -> m (v a)) -> v a -> m (v a)
forall a b. (a -> b) -> a -> b
$ v a
l v a -> v a -> v a
forall (v :: * -> *) a. Vector v a => v a -> v a -> v a
VG.++ v a
r
where
n :: Int
n = Mutable v (PrimState m) a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
VM.length Mutable v (PrimState m) a
v
i' :: Int
i' = Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
i0 :: Int
i0 = Int
i' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k
size :: VG.Vector v a => MStack v s a -> Int
size :: MStack v s a -> Int
size = Mutable v s a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
VM.length (Mutable v s a -> Int)
-> (MStack v s a -> Mutable v s a) -> MStack v s a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MStack v s a -> Mutable v s a
forall (v :: * -> *) s a. MStack v s a -> Mutable v s a
_mVector
get :: (VG.Vector v a, PrimMonad m) => MStack v (PrimState m) a -> m a
get :: MStack v (PrimState m) a -> m a
get (MStack Mutable v (PrimState m) a
v Int
i) = Mutable v (PrimState m) a -> Int -> m a
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VM.unsafeRead Mutable v (PrimState m) a
v Int
i
{-# INLINE get #-}
previous :: VG.Vector v a => MStack v s a -> MStack v s a
previous :: MStack v s a -> MStack v s a
previous (MStack Mutable v s a
v Int
i) = Mutable v s a -> Int -> MStack v s a
forall (v :: * -> *) s a. Mutable v s a -> Int -> MStack v s a
MStack Mutable v s a
v Int
i'
where
j :: Int
j = Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
i' :: Int
i' = if Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 then Mutable v s a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
VM.length Mutable v s a
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 else Int
j
pop :: (VG.Vector v a, PrimMonad m) => MStack v (PrimState m) a -> m (a, MStack v (PrimState m) a)
pop :: MStack v (PrimState m) a -> m (a, MStack v (PrimState m) a)
pop MStack v (PrimState m) a
x = do
a
val <- MStack v (PrimState m) a -> m a
forall (v :: * -> *) a (m :: * -> *).
(Vector v a, PrimMonad m) =>
MStack v (PrimState m) a -> m a
get MStack v (PrimState m) a
x
(a, MStack v (PrimState m) a) -> m (a, MStack v (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
val, MStack v (PrimState m) a -> MStack v (PrimState m) a
forall (v :: * -> *) a s.
Vector v a =>
MStack v s a -> MStack v s a
previous MStack v (PrimState m) a
x)
put :: (VG.Vector v a, PrimMonad m) => a -> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
put :: a -> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
put a
x (MStack Mutable v (PrimState m) a
v Int
i) = Mutable v (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
VM.unsafeWrite Mutable v (PrimState m) a
v Int
i a
x m ()
-> m (MStack v (PrimState m) a) -> m (MStack v (PrimState m) a)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Mutable v (PrimState m) a -> Int -> MStack v (PrimState m) a
forall (v :: * -> *) s a. Mutable v s a -> Int -> MStack v s a
MStack Mutable v (PrimState m) a
v Int
i)
next :: VG.Vector v a => MStack v s a -> MStack v s a
next :: MStack v s a -> MStack v s a
next (MStack Mutable v s a
v Int
i) = Mutable v s a -> Int -> MStack v s a
forall (v :: * -> *) s a. Mutable v s a -> Int -> MStack v s a
MStack Mutable v s a
v Int
i'
where
i' :: Int
i' = (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Mutable v s a -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
VM.length Mutable v s a
v
push :: (VG.Vector v a, PrimMonad m) => a -> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
push :: a -> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
push a
x = a -> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall (v :: * -> *) a (m :: * -> *).
(Vector v a, PrimMonad m) =>
a -> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
put a
x (MStack v (PrimState m) a -> m (MStack v (PrimState m) a))
-> (MStack v (PrimState m) a -> MStack v (PrimState m) a)
-> MStack v (PrimState m) a
-> m (MStack v (PrimState m) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MStack v (PrimState m) a -> MStack v (PrimState m) a
forall (v :: * -> *) a s.
Vector v a =>
MStack v s a -> MStack v s a
next
foldM :: (VG.Vector v b, PrimMonad m) => (a -> b -> a) -> a -> MStack v (PrimState m) b -> m a
foldM :: (a -> b -> a) -> a -> MStack v (PrimState m) b -> m a
foldM a -> b -> a
f a
x MStack v (PrimState m) b
s = Int -> (a -> b -> a) -> a -> MStack v (PrimState m) b -> m a
forall (v :: * -> *) b (m :: * -> *) a.
(Vector v b, PrimMonad m) =>
Int -> (a -> b -> a) -> a -> MStack v (PrimState m) b -> m a
foldKM Int
n a -> b -> a
f a
x MStack v (PrimState m) b
s
where
n :: Int
n = Mutable v (PrimState m) b -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
VM.length (Mutable v (PrimState m) b -> Int)
-> Mutable v (PrimState m) b -> Int
forall a b. (a -> b) -> a -> b
$ MStack v (PrimState m) b -> Mutable v (PrimState m) b
forall (v :: * -> *) s a. MStack v s a -> Mutable v s a
_mVector MStack v (PrimState m) b
s
foldKV ::
(VM.MVector v b, PrimMonad m) =>
Int ->
Int ->
(a -> b -> a) ->
a ->
v (PrimState m) b ->
m a
foldKV :: Int -> Int -> (a -> b -> a) -> a -> v (PrimState m) b -> m a
foldKV Int
0 Int
_ a -> b -> a
_ a
x v (PrimState m) b
_ = a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
foldKV Int
k Int
i a -> b -> a
f a
x v (PrimState m) b
v = do
a
x' <- a -> b -> a
f a
x (b -> a) -> m b -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> v (PrimState m) b -> Int -> m b
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
VM.unsafeRead v (PrimState m) b
v Int
i
Int -> Int -> (a -> b -> a) -> a -> v (PrimState m) b -> m a
forall (v :: * -> * -> *) b (m :: * -> *) a.
(MVector v b, PrimMonad m) =>
Int -> Int -> (a -> b -> a) -> a -> v (PrimState m) b -> m a
foldKV (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) a -> b -> a
f a
x' v (PrimState m) b
v
foldKM :: (VG.Vector v b, PrimMonad m) => Int -> (a -> b -> a) -> a -> MStack v (PrimState m) b -> m a
foldKM :: Int -> (a -> b -> a) -> a -> MStack v (PrimState m) b -> m a
foldKM Int
k a -> b -> a
f a
x (MStack Mutable v (PrimState m) b
v Int
i)
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> m a
forall a. HasCallStack => [Char] -> a
error [Char]
"foldKM: k is negative."
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
n = [Char] -> m a
forall a. HasCallStack => [Char] -> a
error [Char]
"foldKM: k is larger than the stack size."
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
i' = Int
-> Int -> (a -> b -> a) -> a -> Mutable v (PrimState m) b -> m a
forall (v :: * -> * -> *) b (m :: * -> *) a.
(MVector v b, PrimMonad m) =>
Int -> Int -> (a -> b -> a) -> a -> v (PrimState m) b -> m a
foldKV Int
k Int
i a -> b -> a
f a
x Mutable v (PrimState m) b
v
| Bool
otherwise = do
a
x' <- Int
-> Int -> (a -> b -> a) -> a -> Mutable v (PrimState m) b -> m a
forall (v :: * -> * -> *) b (m :: * -> *) a.
(MVector v b, PrimMonad m) =>
Int -> Int -> (a -> b -> a) -> a -> v (PrimState m) b -> m a
foldKV Int
i' Int
i a -> b -> a
f a
x Mutable v (PrimState m) b
v
Int
-> Int -> (a -> b -> a) -> a -> Mutable v (PrimState m) b -> m a
forall (v :: * -> * -> *) b (m :: * -> *) a.
(MVector v b, PrimMonad m) =>
Int -> Int -> (a -> b -> a) -> a -> v (PrimState m) b -> m a
foldKV (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i') (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) a -> b -> a
f a
x' Mutable v (PrimState m) b
v
where
n :: Int
n = Mutable v (PrimState m) b -> Int
forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
VM.length Mutable v (PrimState m) b
v
i' :: Int
i' = Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
data Stack v a = Stack
{ Stack v a -> v a
_iStack :: v a,
Stack v a -> Int
_iIndex :: !Int
}
deriving (Stack v a -> Stack v a -> Bool
(Stack v a -> Stack v a -> Bool)
-> (Stack v a -> Stack v a -> Bool) -> Eq (Stack v a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (v :: * -> *) a. Eq (v a) => Stack v a -> Stack v a -> Bool
/= :: Stack v a -> Stack v a -> Bool
$c/= :: forall (v :: * -> *) a. Eq (v a) => Stack v a -> Stack v a -> Bool
== :: Stack v a -> Stack v a -> Bool
$c== :: forall (v :: * -> *) a. Eq (v a) => Stack v a -> Stack v a -> Bool
Eq, ReadPrec [Stack v a]
ReadPrec (Stack v a)
Int -> ReadS (Stack v a)
ReadS [Stack v a]
(Int -> ReadS (Stack v a))
-> ReadS [Stack v a]
-> ReadPrec (Stack v a)
-> ReadPrec [Stack v a]
-> Read (Stack v a)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (v :: * -> *) a. Read (v a) => ReadPrec [Stack v a]
forall (v :: * -> *) a. Read (v a) => ReadPrec (Stack v a)
forall (v :: * -> *) a. Read (v a) => Int -> ReadS (Stack v a)
forall (v :: * -> *) a. Read (v a) => ReadS [Stack v a]
readListPrec :: ReadPrec [Stack v a]
$creadListPrec :: forall (v :: * -> *) a. Read (v a) => ReadPrec [Stack v a]
readPrec :: ReadPrec (Stack v a)
$creadPrec :: forall (v :: * -> *) a. Read (v a) => ReadPrec (Stack v a)
readList :: ReadS [Stack v a]
$creadList :: forall (v :: * -> *) a. Read (v a) => ReadS [Stack v a]
readsPrec :: Int -> ReadS (Stack v a)
$creadsPrec :: forall (v :: * -> *) a. Read (v a) => Int -> ReadS (Stack v a)
Read, Int -> Stack v a -> ShowS
[Stack v a] -> ShowS
Stack v a -> [Char]
(Int -> Stack v a -> ShowS)
-> (Stack v a -> [Char])
-> ([Stack v a] -> ShowS)
-> Show (Stack v a)
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
forall (v :: * -> *) a. Show (v a) => Int -> Stack v a -> ShowS
forall (v :: * -> *) a. Show (v a) => [Stack v a] -> ShowS
forall (v :: * -> *) a. Show (v a) => Stack v a -> [Char]
showList :: [Stack v a] -> ShowS
$cshowList :: forall (v :: * -> *) a. Show (v a) => [Stack v a] -> ShowS
show :: Stack v a -> [Char]
$cshow :: forall (v :: * -> *) a. Show (v a) => Stack v a -> [Char]
showsPrec :: Int -> Stack v a -> ShowS
$cshowsPrec :: forall (v :: * -> *) a. Show (v a) => Int -> Stack v a -> ShowS
Show)
$(return [])
instance (FromJSON (v a)) => FromJSON (Stack v a) where
parseJSON :: Value -> Parser (Stack v a)
parseJSON = $(mkParseJSON defaultOptions ''Stack)
instance (ToJSON (v a)) => ToJSON (Stack v a) where
toJSON :: Stack v a -> Value
toJSON = $(mkToJSON defaultOptions ''Stack)
toEncoding :: Stack v a -> Encoding
toEncoding = $(mkToEncoding defaultOptions ''Stack)
thaw :: (VG.Vector v a, PrimMonad m) => Stack v a -> m (MStack v (PrimState m) a)
thaw :: Stack v a -> m (MStack v (PrimState m) a)
thaw (Stack v a
v Int
i) = do
Mutable v (PrimState m) a
mv <- v a -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.thaw v a
v
MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (MStack v (PrimState m) a -> m (MStack v (PrimState m) a))
-> MStack v (PrimState m) a -> m (MStack v (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ Mutable v (PrimState m) a -> Int -> MStack v (PrimState m) a
forall (v :: * -> *) s a. Mutable v s a -> Int -> MStack v s a
MStack Mutable v (PrimState m) a
mv Int
i
freeze :: (VG.Vector v a, PrimMonad m) => MStack v (PrimState m) a -> m (Stack v a)
freeze :: MStack v (PrimState m) a -> m (Stack v a)
freeze (MStack Mutable v (PrimState m) a
mv Int
i) = do
v a
v <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze Mutable v (PrimState m) a
mv
Stack v a -> m (Stack v a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Stack v a -> m (Stack v a)) -> Stack v a -> m (Stack v a)
forall a b. (a -> b) -> a -> b
$ v a -> Int -> Stack v a
forall (v :: * -> *) a. v a -> Int -> Stack v a
Stack v a
v Int
i