module Problems.Monads (Operator (..), Element (..), parsePostfix) where
import Data.Char (isDigit)
data Operator
= Negate
| Add
| Subtract
| Multiply
| Divide
| Modulo
deriving (Operator -> Operator -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Operator -> Operator -> Bool
$c/= :: Operator -> Operator -> Bool
== :: Operator -> Operator -> Bool
$c== :: Operator -> Operator -> Bool
Eq, Int -> Operator
Operator -> Int
Operator -> [Operator]
Operator -> Operator
Operator -> Operator -> [Operator]
Operator -> Operator -> Operator -> [Operator]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Operator -> Operator -> Operator -> [Operator]
$cenumFromThenTo :: Operator -> Operator -> Operator -> [Operator]
enumFromTo :: Operator -> Operator -> [Operator]
$cenumFromTo :: Operator -> Operator -> [Operator]
enumFromThen :: Operator -> Operator -> [Operator]
$cenumFromThen :: Operator -> Operator -> [Operator]
enumFrom :: Operator -> [Operator]
$cenumFrom :: Operator -> [Operator]
fromEnum :: Operator -> Int
$cfromEnum :: Operator -> Int
toEnum :: Int -> Operator
$ctoEnum :: Int -> Operator
pred :: Operator -> Operator
$cpred :: Operator -> Operator
succ :: Operator -> Operator
$csucc :: Operator -> Operator
Enum, Operator
forall a. a -> a -> Bounded a
maxBound :: Operator
$cmaxBound :: Operator
minBound :: Operator
$cminBound :: Operator
Bounded, Int -> Operator -> ShowS
[Operator] -> ShowS
Operator -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Operator] -> ShowS
$cshowList :: [Operator] -> ShowS
show :: Operator -> String
$cshow :: Operator -> String
showsPrec :: Int -> Operator -> ShowS
$cshowsPrec :: Int -> Operator -> ShowS
Show)
data Element = Operator Operator | Operand Integer deriving (Element -> Element -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Element -> Element -> Bool
$c/= :: Element -> Element -> Bool
== :: Element -> Element -> Bool
$c== :: Element -> Element -> Bool
Eq, Int -> Element -> ShowS
[Element] -> ShowS
Element -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Element] -> ShowS
$cshowList :: [Element] -> ShowS
show :: Element -> String
$cshow :: Element -> String
showsPrec :: Int -> Element -> ShowS
$cshowsPrec :: Int -> Element -> ShowS
Show)
parsePostfix :: String -> [Element]
parsePostfix :: String -> [Element]
parsePostfix String
expr = forall a b. (a -> b) -> [a] -> [b]
map String -> Element
parseToken forall a b. (a -> b) -> a -> b
$ String -> [String]
words String
expr
parseToken :: String -> Element
parseToken :: String -> Element
parseToken String
x
| forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isDigit String
x = Integer -> Element
Operand (forall a. Read a => String -> a
read String
x)
| String
x forall a. Eq a => a -> a -> Bool
== String
"negate" = Operator -> Element
Operator Operator
Negate
| String
x forall a. Eq a => a -> a -> Bool
== String
"+" = Operator -> Element
Operator Operator
Add
| String
x forall a. Eq a => a -> a -> Bool
== String
"-" = Operator -> Element
Operator Operator
Subtract
| String
x forall a. Eq a => a -> a -> Bool
== String
"*" = Operator -> Element
Operator Operator
Multiply
| String
x forall a. Eq a => a -> a -> Bool
== String
"/" = Operator -> Element
Operator Operator
Divide
| String
x forall a. Eq a => a -> a -> Bool
== String
"%" = Operator -> Element
Operator Operator
Modulo
| Bool
otherwise = forall a. HasCallStack => a
undefined