{-# OPTIONS_GHC -fno-warn-unused-imports    #-}

module Text.RE.ZeInternals.Types.Poss where

import           Control.Monad.Fail


data Poss a
  = Eek String
  | Yup a
  deriving (Poss a -> Poss a -> Bool
(Poss a -> Poss a -> Bool)
-> (Poss a -> Poss a -> Bool) -> Eq (Poss a)
forall a. Eq a => Poss a -> Poss a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Poss a -> Poss a -> Bool
$c/= :: forall a. Eq a => Poss a -> Poss a -> Bool
== :: Poss a -> Poss a -> Bool
$c== :: forall a. Eq a => Poss a -> Poss a -> Bool
Eq,Eq (Poss a)
Eq (Poss a)
-> (Poss a -> Poss a -> Ordering)
-> (Poss a -> Poss a -> Bool)
-> (Poss a -> Poss a -> Bool)
-> (Poss a -> Poss a -> Bool)
-> (Poss a -> Poss a -> Bool)
-> (Poss a -> Poss a -> Poss a)
-> (Poss a -> Poss a -> Poss a)
-> Ord (Poss a)
Poss a -> Poss a -> Bool
Poss a -> Poss a -> Ordering
Poss a -> Poss a -> Poss a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Poss a)
forall a. Ord a => Poss a -> Poss a -> Bool
forall a. Ord a => Poss a -> Poss a -> Ordering
forall a. Ord a => Poss a -> Poss a -> Poss a
min :: Poss a -> Poss a -> Poss a
$cmin :: forall a. Ord a => Poss a -> Poss a -> Poss a
max :: Poss a -> Poss a -> Poss a
$cmax :: forall a. Ord a => Poss a -> Poss a -> Poss a
>= :: Poss a -> Poss a -> Bool
$c>= :: forall a. Ord a => Poss a -> Poss a -> Bool
> :: Poss a -> Poss a -> Bool
$c> :: forall a. Ord a => Poss a -> Poss a -> Bool
<= :: Poss a -> Poss a -> Bool
$c<= :: forall a. Ord a => Poss a -> Poss a -> Bool
< :: Poss a -> Poss a -> Bool
$c< :: forall a. Ord a => Poss a -> Poss a -> Bool
compare :: Poss a -> Poss a -> Ordering
$ccompare :: forall a. Ord a => Poss a -> Poss a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (Poss a)
Ord,Int -> Poss a -> ShowS
[Poss a] -> ShowS
Poss a -> String
(Int -> Poss a -> ShowS)
-> (Poss a -> String) -> ([Poss a] -> ShowS) -> Show (Poss a)
forall a. Show a => Int -> Poss a -> ShowS
forall a. Show a => [Poss a] -> ShowS
forall a. Show a => Poss a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Poss a] -> ShowS
$cshowList :: forall a. Show a => [Poss a] -> ShowS
show :: Poss a -> String
$cshow :: forall a. Show a => Poss a -> String
showsPrec :: Int -> Poss a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Poss a -> ShowS
Show)

instance Functor Poss where
  fmap :: (a -> b) -> Poss a -> Poss b
fmap a -> b
f Poss a
p = case Poss a
p of
    Eek String
m -> String -> Poss b
forall a. String -> Poss a
Eek String
m
    Yup a
x -> b -> Poss b
forall a. a -> Poss a
Yup (b -> Poss b) -> b -> Poss b
forall a b. (a -> b) -> a -> b
$ a -> b
f a
x

instance Applicative Poss where
  pure :: a -> Poss a
pure        = a -> Poss a
forall a. a -> Poss a
Yup
  <*> :: Poss (a -> b) -> Poss a -> Poss b
(<*>) Poss (a -> b)
p1 Poss a
p2 = case Poss (a -> b)
p1 of
    Eek String
m -> String -> Poss b
forall a. String -> Poss a
Eek String
m
    Yup a -> b
f -> case Poss a
p2 of
      Eek String
n -> String -> Poss b
forall a. String -> Poss a
Eek String
n
      Yup a
x -> b -> Poss b
forall a. a -> Poss a
Yup (b -> Poss b) -> b -> Poss b
forall a b. (a -> b) -> a -> b
$ a -> b
f a
x

instance Monad Poss where
  return :: a -> Poss a
return = a -> Poss a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  >>= :: Poss a -> (a -> Poss b) -> Poss b
(>>=) Poss a
p a -> Poss b
f = case Poss a
p of
    Eek String
m -> String -> Poss b
forall a. String -> Poss a
Eek String
m
    Yup a
x -> a -> Poss b
f a
x

instance MonadFail Poss where
  fail :: String -> Poss a
fail = String -> Poss a
forall a. String -> Poss a
Eek

poss :: (String->b) -> (a->b) -> Poss a -> b
poss :: (String -> b) -> (a -> b) -> Poss a -> b
poss String -> b
f a -> b
_ (Eek String
s) = String -> b
f String
s
poss String -> b
_ a -> b
g (Yup a
x) = a -> b
g a
x

poss2either :: Poss a -> Either String a
poss2either :: Poss a -> Either String a
poss2either (Eek String
m) = String -> Either String a
forall a b. a -> Either a b
Left  String
m
poss2either (Yup a
x) = a -> Either String a
forall a b. b -> Either a b
Right a
x