7 import Control.Applicative
9 import Text.Parsers.Simple.ParserCombinators
11 read :: *File -> [[Char]]
13 # (l, f) = freadline f
14 | l.[size l - 1] <> '\n' = []
15 = [[c\\c<-:l | c <> '\n']:read f]
22 one = fmap sum o sequence o map (parse pExpr)
23 two = fmap sum o sequence o map (parse pExpr`)
25 pExpr :: Parser Char Int
26 pExpr = flip pChainl1 (pOp (+) '+' <|> pOp (*) '*') $ pInt <|> (pPOpen *> pExpr <* pPClose)
28 pExpr` :: Parser Char Int
30 = flip pChainl1 (pOp (*) '*')
31 $ flip pChainl1 (pOp (+) '+')
32 $ pInt <|> (pPOpen *> pExpr` <* pPClose)
34 pOp :: (Int Int -> Int) Char -> Parser Char (Int Int -> Int)
35 pOp op c = op <$ pSpace <* pToken c <* pSpace
37 pInt :: Parser Char Int
38 pInt = toInt o toString <$> some pDigit