@@ -6,7 +6,7 @@ module Json.Decode
66 , list, dict, maybe
77 , field, at
88 , index
9− , map, map2, succeed, fail, andThen
9+ , map, map2, succeed, fail, andThen, oneOf
1010 )
1111 where
1212
@@ -37,6 +37,7 @@ data Decoder a =
3737data Error
3838 = Field Text Error
3939 | Index Int Error
40+ | OneOf [Error]
4041 | Failure Aeson.Value String
4142
4243
@@ -269,3 +270,27 @@ andThen callback (Decoder runA) =
269270 do a <- runA mkError value
270271 let (Decoder runB) = callback a
271272 runB mkError value
273+
274+
275+
276+-- ONE OF
277+
278+
279+oneOf :: [Decoder a] -> Decoder a
280+oneOf decoders =
281+ Decoder (oneOfHelp decoders [])
282+
283+
284+oneOfHelp :: [Decoder a] -> [Error] -> (Error -> Error) -> Aeson.Value -> Either Error a
285+oneOfHelp decoders errors mkError value =
286+ case decoders of
287+ [] ->
288+ Left (mkError (OneOf (reverse errors)))
289+
290+ Decoder run : otherDecoders ->
291+ case run mkError value of
292+ Right a ->
293+ Right a
294+
295+ Left err ->
296+ oneOfHelp otherDecoders (err:errors) mkError value