module Data.Stack.ST (
Stack,
stackNew,
stackPush,
stackPeek,
stackPop,
stackIsEmpty,
stackSize,
)
where
import Data.STRef
import Control.Monad.ST
import qualified Data.Stack as Pure
import Numeric.Natural
newtype Stack s a = Stack (STRef s (Pure.Stack a))
stackNew :: ST s (Stack s a)
stackNew = do
stackRef <- newSTRef Pure.stackNew
return (Stack stackRef)
stackPush :: Stack s a -> a -> ST s ()
stackPush (Stack stackRef) item = modifySTRef' stackRef (\stack -> Pure.stackPush stack item)
stackPeek :: Stack s a -> ST s (Maybe a)
stackPeek (Stack stackRef) = do
stack <- readSTRef stackRef
return (Pure.stackPeek stack)
stackPop :: Stack s a -> ST s (Maybe a)
stackPop (Stack stackRef) = do
stack <- readSTRef stackRef
case Pure.stackPop stack of
Just (stack1,item) -> do writeSTRef stackRef stack1
return (Just item)
Nothing -> return Nothing
stackIsEmpty :: Stack s a -> ST s Bool
stackIsEmpty (Stack stackRef) = do
stack <- readSTRef stackRef
return (Pure.stackIsEmpty stack)
stackSize :: Stack s a -> ST s Natural
stackSize (Stack stackRef) = do
stack <- readSTRef stackRef
return (Pure.stackSize stack)