58 lines
1.3 KiB
Haskell
58 lines
1.3 KiB
Haskell
|
module ManaParser where
|
||
|
|
||
|
import Mana
|
||
|
import Text.ParserCombinators.Parsec
|
||
|
|
||
|
mana :: Parser Cost
|
||
|
mana = do
|
||
|
colorless' <- (many colorless)
|
||
|
colored' <- (many colored)
|
||
|
hybrid' <- (many hybrid)
|
||
|
phyrexian' <- (many phyrexian)
|
||
|
eof
|
||
|
return $ Cost (colorless' ++ colored') hybrid' phyrexian'
|
||
|
|
||
|
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'
|