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