module Data.Aeson.AutoType.Alternative(
Alt(..)
, toEither, fromEither
) where
import Data.Aeson
import Control.Applicative
data Alt a b = FirstAlt a
| SecondAlt b
deriving(Show,Eq,Ord)
toEither :: Alt a b -> Either a b
toEither (FirstAlt a) = Left a
toEither (SecondAlt b) = Right b
fromEither :: Either a b -> Alt a b
fromEither (Left a) = FirstAlt a
fromEither (Right b) = SecondAlt b
instance (ToJSON a, ToJSON b) => ToJSON (Alt a b) where
toJSON (FirstAlt a) = toJSON a
toJSON (SecondAlt b) = toJSON b
instance (FromJSON a, FromJSON b) => FromJSON (Alt a b) where
parseJSON input = (FirstAlt <$> parseJSON input) <|>
(SecondAlt <$> parseJSON input) <|>
fail ("Neither alternative was found for: " ++ show input)