module HarmTrace.HAnTree.HAnParser where
import HarmTrace.Base.Parsing
import HarmTrace.Base.MusicRep (Mode(..))
import HarmTrace.HAnTree.HAn
import Data.Maybe (isJust, fromJust)
parseHAn :: ListLike state Char => state -> HAn
parseHAn inp
| isJust a = fromJust a
| otherwise = parseData (HAn 1 <$> pAnyStr) inp where
a = parseData (pMaybe $ HAnFunc <$> pHFunc) inp
pHFunc :: Parser HFunc
pHFunc = Ton 1 <$ pSym 'T' <*> pMode <* pSym '_' <*> pInteger <*> pMaybe pSpec
<|> Dom 1 <$ pSym 'D' <*> pMode <* pSym '_' <*> pInteger <*> pMaybe pSpec
<|> Sub 1 <$ pSym 'S' <*> pMode <* pSym '_' <*> pInteger <*> pMaybe pSpec
<|> PD <$ pString "PD"
<|> PT <$ pString "PT"
pMode :: Parser Mode
pMode = MinMode <$ pSym 'm'
<|> MajMode <$ pString ""
pSpec :: Parser Spec
pSpec = MinBorrow <$ pString "_bor"
<|> Blues <$ pString "_bls"
<|> Parallel <$ pString "_par"
pAnyStr :: Parser String
pAnyStr = pAtMost 15 pAscii