{-# 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