{-# LANGUAGE OverloadedStrings #-} module Text.Puzzles.Puzzle where import Data.Yaml import Control.Applicative import Data.Puzzles.PuzzleTypes data TypedPuzzle = TP (Maybe String) Value (Maybe Value) deriving Show instance FromJSON TypedPuzzle where parseJSON (Object v) = TP <$> v .:? "type" <*> v .: "puzzle" <*> v .:? "solution" parseJSON _ = empty -- | A pair of parsers for a puzzle type. -- First parses the puzzle, second the solution. type ParsePuzzle a b = (Value -> Parser a, Value -> Parser b) parseType :: String -> Parser PuzzleType parseType t = case lookupType t of Nothing -> fail $ "unknown puzzle type: " ++ t Just p -> return p