57 lines
1.3 KiB
Haskell
57 lines
1.3 KiB
Haskell
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'
|