module Music.Theory.Parse (rnrtnmi) where
import Control.Monad
import Music.Theory.Pitch
import Text.ParserCombinators.Parsec
type P a = GenParser Char () a
is_char :: Char -> P Bool
is_char c =
let f '_' = False
f _ = True
in liftM f (option '_' (char c))
get_int :: P Int
get_int = liftM read (many1 digit)
rnrtnmi :: String -> SRO Int
rnrtnmi s =
let p = do { r <- rot
; r' <- is_char 'R'
; char 'T'
; t <- get_int
; m <- is_char 'M'
; i <- is_char 'I'
; eof
; return (SRO r r' t m i) }
rot = option 0 (char 'r' >> get_int)
in either
(\e -> error ("rnRTnMI parse failed\n" ++ show e))
id
(parse p "" s)