-- Pushes a new state a level down, this means the beginning of a loop or function
pushState :: (Monad m) => (MonadIO m) => SM m ()
pushState = do
  liftIO $ putStrLn "push"
  cs <- get
  put $ newState cs

-- Pop the current state and make it's parent the current state
-- Occurs at the end of a function or a loop
pushState :: (Monad m) => (MonadIO m) => SM m ()
pushState = do
  liftIO $ putStrLn "push"
  cs <- get
  put $ newState cs

-- Pop the current state and make it's parent the current state
-- Occurs at the end of a function or a loop
pushState = do
  liftIO $ putStrLn "push"
  cs <- get
  put $ newState cs

-- Pop the current state and make it's parent the current state
-- Occurs at the end of a function or a loop