Last active
October 20, 2015 16:52
-
-
Save seanparsons/3dd5e2f85bc903f6b561 to your computer and use it in GitHub Desktop.
Thoughts about how to build Argonaut Haskell Edition.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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