Scale.hs 751 B

12345678910111213141516171819202122232425
  1. {-# LANGUAGE ViewPatterns #-}
  2. module Formats.Scale where
  3. import Data.Sequence (Seq)
  4. import qualified Data.Sequence as S
  5. import Data.Text (Text)
  6. import qualified Data.Text as T
  7. import State (Note(..))
  8. parse :: Text -> Either String (Seq Note)
  9. parse t = case T.lines t of
  10. ((T.takeWhile (/= '#') -> "hypsibius scale"):rs) -> parseLines rs
  11. _ -> Left "Not a valid Hypsibius scale: missing header\n"
  12. parseLines :: [Text] -> Either String (Seq Note)
  13. parseLines [] = pure S.empty
  14. parseLines (l:ls) =
  15. case T.words (T.takeWhile (/= '#') l) of
  16. [] -> parseLines ls
  17. [cents, name] ->
  18. let n = Note (read (T.unpack cents)) name
  19. in (n S.<|) <$> parseLines ls
  20. rs -> Left ("Bad declaration: " ++ show rs)