{-# LANGUAGE ImportQualifiedPost #-} module Parse where import Common import Data.Char (digitToInt) import Data.Function ((&)) import Data.Text qualified as T import Data.Void import Text.Megaparsec qualified as M import Text.Megaparsec.Char (digitChar) import Text.Megaparsec.Char qualified as MC import Text.Megaparsec.Char.Lexer qualified as MCL import Util (both) type Parser = M.Parsec Void T.Text someLines :: Parser a -> Parser [a] someLines p = p `M.sepEndBy1` MC.newline number :: Parser Int number = MCL.decimal digit :: Parser Int digit = digitToInt <$> digitChar parsecDay :: Parser a -> (a -> Result, a -> Result) -> Day parsecDay parser parts = ParsecDay ( \path text -> ( case M.parse (parser <* M.eof) path text of Left e -> Left $ M.errorBundlePretty e Right parsedInput -> Right $ both (parsedInput &) parts ) )