module SAT.Solver.Mios.Data.Stack
(
Stack
, newStack
, clearStack
, sizeOfStack
, pushToStack
, popFromStack
, lastOfStack
, shrinkStack
, asSizedVec
, isoVec
)
where
import qualified Data.Vector.Unboxed.Mutable as UV
import SAT.Solver.Mios.Types
newtype Stack = Stack
{
ivec :: UV.IOVector Int
}
instance VectorFamily Stack Int where
dump str v = (str ++) . show <$> asList v
asVec (Stack v) = UV.unsafeTail v
asList (Stack v) = do
(n : l) <- asList v
return $ take n l
sizeOfStack :: Stack -> IO Int
sizeOfStack (Stack v) = UV.unsafeRead v 0
clearStack :: Stack -> IO ()
clearStack (Stack v) = UV.unsafeWrite v 0 0
newStack :: Int -> IO Stack
newStack n = do
v <- UV.new $ n + 1
UV.set v 0
return $ Stack v
pushToStack :: Stack -> Int -> IO ()
pushToStack (Stack v) !x = do
!i <- (+ 1) <$> UV.unsafeRead v 0
UV.unsafeWrite v i x
UV.unsafeWrite v 0 i
popFromStack :: Stack -> IO ()
popFromStack (Stack v) = UV.unsafeModify v (subtract 1) 0
lastOfStack :: Stack -> IO Int
lastOfStack (Stack v) = UV.unsafeRead v =<< UV.unsafeRead v 0
shrinkStack :: Stack -> Int -> IO ()
shrinkStack (Stack v) k = UV.unsafeModify v (subtract k) 0
asSizedVec :: Stack -> Vec
asSizedVec (Stack v) = v
isoVec :: Stack -> IO Vec
isoVec (Stack v) = UV.clone . flip UV.take v . (1 +) =<< UV.unsafeRead v 0