Refactor to use existential

This commit is contained in:
George Thomas 2025-12-02 11:21:04 +00:00
parent b19c02811e
commit ce3e586e0c

View File

@ -28,7 +28,7 @@ main =
, puzzleTest puzzle2 , puzzleTest puzzle2
] ]
puzzleTest :: Puzzle a -> TestTree puzzleTest :: Puzzle -> TestTree
puzzleTest Puzzle{number, parser, parts} = puzzleTest Puzzle{number, parser, parts} =
testGroup pt $ testGroup pt $
["examples", "real"] <&> \t -> ["examples", "real"] <&> \t ->
@ -43,13 +43,13 @@ puzzleTest Puzzle{number, parser, parts} =
either (fail . ("parse failure: " <>) . errorBundlePretty) pure . runParser (parser <* eof) fp either (fail . ("parse failure: " <>) . errorBundlePretty) pure . runParser (parser <* eof) fp
=<< T.readFile fp =<< T.readFile fp
data Puzzle input = Puzzle data Puzzle = forall input. Puzzle
{ number :: Word { number :: Word
, parser :: Parsec Void Text input , parser :: Parsec Void Text input
, parts :: [input -> Text] , parts :: [input -> Text]
} }
puzzle1 :: Puzzle [(Direction, Inc)] puzzle1 :: Puzzle
puzzle1 = puzzle1 =
Puzzle Puzzle
{ number = 1 { number = 1
@ -94,7 +94,7 @@ step (Inc i) d (Pos p) = bimap Count Pos case d of
L -> (p - i) `divMod` 100 L -> (p - i) `divMod` 100
R -> (p + i) `divMod` 100 R -> (p + i) `divMod` 100
puzzle2 :: Puzzle [(ID, ID)] puzzle2 :: Puzzle
puzzle2 = puzzle2 =
Puzzle Puzzle
{ number = 2 { number = 2