2023-08-27 22:30:00 +02:00
|
|
|
{-# LANGUAGE ImportQualifiedPost #-}
|
|
|
|
|
|
|
|
|
|
module Parse where
|
|
|
|
|
|
2023-08-30 09:32:12 +02:00
|
|
|
import Common
|
|
|
|
|
import Data.Function ((&))
|
|
|
|
|
import Data.Text qualified as T
|
|
|
|
|
import Data.Void
|
2023-08-27 22:30:00 +02:00
|
|
|
import Text.Megaparsec qualified as M
|
|
|
|
|
import Text.Megaparsec.Char qualified as MC
|
|
|
|
|
import Text.Megaparsec.Char.Lexer qualified as MCL
|
2023-08-30 09:32:12 +02:00
|
|
|
import Util (both)
|
2023-08-27 22:30:00 +02:00
|
|
|
|
|
|
|
|
someLines :: Parser a -> Parser [a]
|
|
|
|
|
someLines p = p `M.sepEndBy1` MC.newline
|
|
|
|
|
|
|
|
|
|
number :: Parser Int
|
2023-08-30 09:32:12 +02:00
|
|
|
number = MCL.decimal
|
|
|
|
|
|
|
|
|
|
type Parser = M.Parsec Void T.Text
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
)
|
|
|
|
|
)
|