module Chemistry.Formula ( Formula(..)
, parseFormula
) where
import Text.ParserCombinators.Parsec
type ElementSymbol = String
data Formula = FGroup [(Formula, Int)]
| FElement ElementSymbol
deriving (Eq, Show)
parseFormula :: String -> Formula
parseFormula xs = case parse formula "" xs of
Left _ -> FGroup []
Right val -> FGroup val
formula :: Parser [(Formula, Int)]
formula = many elementSymbol
elementSymbol :: Parser (Formula, Int)
elementSymbol = do
l1 <- upper
l2 <- many lower
let e = FElement (l1:l2)
ds <- many digit
let n = if null ds then 1 else read ds :: Int
return (e, n)