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) -- | Parse a Morris format serial operator descriptor. 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)