{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE OverloadedStrings #-} module HaskellWorks.Data.Xml.DecodeResult where import Control.Applicative import HaskellWorks.Data.Xml.DecodeError data DecodeResult a = DecodeOk a | DecodeFailed DecodeError deriving (DecodeResult a -> DecodeResult a -> Bool (DecodeResult a -> DecodeResult a -> Bool) -> (DecodeResult a -> DecodeResult a -> Bool) -> Eq (DecodeResult a) forall a. Eq a => DecodeResult a -> DecodeResult a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: DecodeResult a -> DecodeResult a -> Bool $c/= :: forall a. Eq a => DecodeResult a -> DecodeResult a -> Bool == :: DecodeResult a -> DecodeResult a -> Bool $c== :: forall a. Eq a => DecodeResult a -> DecodeResult a -> Bool Eq, Int -> DecodeResult a -> ShowS [DecodeResult a] -> ShowS DecodeResult a -> String (Int -> DecodeResult a -> ShowS) -> (DecodeResult a -> String) -> ([DecodeResult a] -> ShowS) -> Show (DecodeResult a) forall a. Show a => Int -> DecodeResult a -> ShowS forall a. Show a => [DecodeResult a] -> ShowS forall a. Show a => DecodeResult a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [DecodeResult a] -> ShowS $cshowList :: forall a. Show a => [DecodeResult a] -> ShowS show :: DecodeResult a -> String $cshow :: forall a. Show a => DecodeResult a -> String showsPrec :: Int -> DecodeResult a -> ShowS $cshowsPrec :: forall a. Show a => Int -> DecodeResult a -> ShowS Show, a -> DecodeResult b -> DecodeResult a (a -> b) -> DecodeResult a -> DecodeResult b (forall a b. (a -> b) -> DecodeResult a -> DecodeResult b) -> (forall a b. a -> DecodeResult b -> DecodeResult a) -> Functor DecodeResult forall a b. a -> DecodeResult b -> DecodeResult a forall a b. (a -> b) -> DecodeResult a -> DecodeResult b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: a -> DecodeResult b -> DecodeResult a $c<$ :: forall a b. a -> DecodeResult b -> DecodeResult a fmap :: (a -> b) -> DecodeResult a -> DecodeResult b $cfmap :: forall a b. (a -> b) -> DecodeResult a -> DecodeResult b Functor) instance Applicative DecodeResult where pure :: a -> DecodeResult a pure = a -> DecodeResult a forall a. a -> DecodeResult a DecodeOk {-# INLINE pure #-} <*> :: DecodeResult (a -> b) -> DecodeResult a -> DecodeResult b (<*>) (DecodeOk a -> b f ) (DecodeOk a a) = b -> DecodeResult b forall a. a -> DecodeResult a DecodeOk (a -> b f a a) (<*>) (DecodeOk a -> b _ ) (DecodeFailed DecodeError e) = DecodeError -> DecodeResult b forall a. DecodeError -> DecodeResult a DecodeFailed DecodeError e (<*>) (DecodeFailed DecodeError e) DecodeResult a _ = DecodeError -> DecodeResult b forall a. DecodeError -> DecodeResult a DecodeFailed DecodeError e {-# INLINE (<*>) #-} instance Monad DecodeResult where >>= :: DecodeResult a -> (a -> DecodeResult b) -> DecodeResult b (>>=) (DecodeOk a a) a -> DecodeResult b f = a -> DecodeResult b f a a (>>=) (DecodeFailed DecodeError e) a -> DecodeResult b _ = DecodeError -> DecodeResult b forall a. DecodeError -> DecodeResult a DecodeFailed DecodeError e {-# INLINE (>>=) #-} instance Alternative DecodeResult where empty :: DecodeResult a empty = DecodeError -> DecodeResult a forall a. DecodeError -> DecodeResult a DecodeFailed (Text -> DecodeError DecodeError Text "Failed decode") <|> :: DecodeResult a -> DecodeResult a -> DecodeResult a (<|>) (DecodeOk a a) DecodeResult a _ = a -> DecodeResult a forall a. a -> DecodeResult a DecodeOk a a (<|>) DecodeResult a _ (DecodeOk a b) = a -> DecodeResult a forall a. a -> DecodeResult a DecodeOk a b (<|>) DecodeResult a _ (DecodeFailed DecodeError e) = DecodeError -> DecodeResult a forall a. DecodeError -> DecodeResult a DecodeFailed DecodeError e {-# INLINE (<|>) #-} instance Foldable DecodeResult where foldr :: (a -> b -> b) -> b -> DecodeResult a -> b foldr a -> b -> b f b z (DecodeOk a a) = a -> b -> b f a a b z foldr a -> b -> b _ b z (DecodeFailed DecodeError _) = b z instance Traversable DecodeResult where traverse :: (a -> f b) -> DecodeResult a -> f (DecodeResult b) traverse a -> f b _ (DecodeFailed DecodeError e) = DecodeResult b -> f (DecodeResult b) forall (f :: * -> *) a. Applicative f => a -> f a pure (DecodeError -> DecodeResult b forall a. DecodeError -> DecodeResult a DecodeFailed DecodeError e) traverse a -> f b f (DecodeOk a x) = b -> DecodeResult b forall a. a -> DecodeResult a DecodeOk (b -> DecodeResult b) -> f b -> f (DecodeResult b) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> a -> f b f a x toEither :: DecodeResult a -> Either DecodeError a toEither :: DecodeResult a -> Either DecodeError a toEither (DecodeOk a a) = a -> Either DecodeError a forall a b. b -> Either a b Right a a toEither (DecodeFailed DecodeError e) = DecodeError -> Either DecodeError a forall a b. a -> Either a b Left DecodeError e isOk :: DecodeResult a -> Bool isOk :: DecodeResult a -> Bool isOk (DecodeOk a _) = Bool True isOk DecodeResult a _ = Bool False isFailed :: DecodeResult a -> Bool isFailed :: DecodeResult a -> Bool isFailed (DecodeFailed DecodeError _) = Bool True isFailed DecodeResult a _ = Bool False