Skip to content

Instantly share code, notes, and snippets.

@seanparsons
Last active October 20, 2015 16:52
Show Gist options
  • Save seanparsons/3dd5e2f85bc903f6b561 to your computer and use it in GitHub Desktop.
Save seanparsons/3dd5e2f85bc903f6b561 to your computer and use it in GitHub Desktop.
Thoughts about how to build Argonaut Haskell Edition.
data Json = JsonBool Bool
| JsonArray [Json]
| JsonNull
deriving (Eq, Show)
type JSONError = ()
type JSONReader a b = a -> Either JSONError (b, a)
boolReader :: (Bool -> b) -> JSONReader String b
boolReader transform ('t' : 'r' : 'u' : 'e' : tail) = Right (transform True, tail)
boolReader transform ('f' : 'a' : 'l' : 's' : 'e' : tail) = Right (transform False, tail)
boolReader _ _ = Left ()
arrayElementReader :: a -> (a -> b -> a) -> JSONReader String b -> JSONReader String a
arrayElementReader init fold elementReader (',' : tail) = arrayElementReader init fold elementReader tail
arrayElementReader init _ _ (']' : tail) = Right (init, tail)
arrayElementReader init fold elementReader text = case (elementReader text) of
(Left error) -> Left error
(Right (elem, tail)) -> arrayElementReader (fold init elem) fold elementReader tail
arrayReader :: a -> (a -> b -> a) -> JSONReader String b -> JSONReader String a
arrayReader init fold elementReader ('[' : tail) = arrayElementReader init fold elementReader tail
arrayReader _ _ _ _ = Left ()
nullReader :: a -> JSONReader String a
nullReader value ('n' : 'u' : 'l' : 'l' : tail) = Right (value, tail)
jsonReader :: JSONReader String Json
jsonReader text@('t' : _) = boolReader JsonBool text
jsonReader text@('f' : _) = boolReader JsonBool text
jsonReader text@('n' : _) = nullReader JsonNull text
jsonReader text@('[' : _) = fmap (\(arr, tail) -> (JsonArray $ reverse arr, tail)) $ arrayReader [] (flip (:)) jsonReader text
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment