{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
module Stack (
Stack
, empty
, pop
, push
, top
, tasks
) where
import MyState (MyState (..))
type Stack = [Int]
empty :: Stack
empty :: Stack
empty = []
pop :: MyState Stack Int
pop :: MyState Stack Int
pop = (Stack -> (Int, Stack)) -> MyState Stack Int
forall s a. (s -> (a, s)) -> MyState s a
MyState ((Stack -> (Int, Stack)) -> MyState Stack Int)
-> (Stack -> (Int, Stack)) -> MyState Stack Int
forall a b. (a -> b) -> a -> b
$ \(Int
x:Stack
xs) -> (Int
x, Stack
xs)
push :: Int -> MyState Stack ()
push :: Int -> MyState Stack ()
push Int
a = (Stack -> ((), Stack)) -> MyState Stack ()
forall s a. (s -> (a, s)) -> MyState s a
MyState ((Stack -> ((), Stack)) -> MyState Stack ())
-> (Stack -> ((), Stack)) -> MyState Stack ()
forall a b. (a -> b) -> a -> b
$ \Stack
xs -> ((), Int
aInt -> Stack -> Stack
forall a. a -> [a] -> [a]
:Stack
xs)
top :: MyState Stack Int
top :: MyState Stack Int
top = (Stack -> (Int, Stack)) -> MyState Stack Int
forall s a. (s -> (a, s)) -> MyState s a
MyState ((Stack -> (Int, Stack)) -> MyState Stack Int)
-> (Stack -> (Int, Stack)) -> MyState Stack Int
forall a b. (a -> b) -> a -> b
$ \(Int
x:Stack
xs) -> (Int
x, Int
xInt -> Stack -> Stack
forall a. a -> [a] -> [a]
:Stack
xs)
tasks :: MyState Stack Int
tasks :: MyState Stack Int
tasks = do
Int -> MyState Stack ()
push Int
1
Int -> MyState Stack ()
push Int
2
Int -> MyState Stack ()
push Int
3
Int
a <- MyState Stack Int
pop
Int
b <- MyState Stack Int
pop
Int -> MyState Stack ()
push (Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
b)
MyState Stack Int
top