module ManaParser where import Mana import Text.ParserCombinators.Parsec cost :: Parser Cost cost = do colorless' <- many colorless hybrid' <- many $ try hybrid phyrexian' <- many $ try phyrexian colored' <- many colored return $ Cost (colorless' ++ colored') hybrid' phyrexian' "mana cost" standard :: Parser Standard standard = colorless <|> colored colorless :: Parser Standard colorless = do mana <- many1 digit return $ Standard (read mana :: Int) Colorless colored :: Parser Standard colored = do mana <- many1 (oneOf ("Uu")) return $ Standard (length mana) Blue <|> do mana <- many1 (oneOf ("Rr")) return $ Standard (length mana) Red <|> do mana <- many1 (oneOf ("Bb")) return $ Standard (length mana) Black <|> do mana <- many1 (oneOf ("Gg")) return $ Standard (length mana) Green <|> do mana <- many1 (oneOf ("Ww")) return $ Standard (length mana) White hybrid :: Parser Hybrid hybrid = do char '(' standard' <- standard char '/' standard'' <- standard char ')' return $ Hybrid standard' standard'' phyrexian :: Parser Phyrexian phyrexian = do char '(' standard' <- standard string "/p)" return $ Phyrexian standard'