module UVMHS.Core.Data.Option where

import UVMHS.Core.Init
import UVMHS.Core.Classes

import qualified Prelude as HS

instance Functor 𝑂 where 
  map :: forall a b. (a -> b) -> 𝑂 a -> 𝑂 b
map = (a -> b) -> 𝑂 a -> 𝑂 b
forall (m :: * -> *) a b. Monad m => (a -> b) -> m a -> m b
mmap
instance Return 𝑂 where 
  return :: forall a. a -> 𝑂 a
return = a -> 𝑂 a
forall a. a -> 𝑂 a
Some
instance Bind 𝑂 where 
  𝑂 a
xO ≫= :: forall a b. 𝑂 a -> (a -> 𝑂 b) -> 𝑂 b
≫= a -> 𝑂 b
k = case 𝑂 a
xO of {𝑂 a
None  𝑂 b
forall a. 𝑂 a
None;Some a
x  a -> 𝑂 b
k a
x}
instance Monad 𝑂
instance FunctorM 𝑂 where 
  mapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> 𝑂 a -> m (𝑂 b)
mapM a -> m b
f = \case
    𝑂 a
None  𝑂 b -> m (𝑂 b)
forall a. a -> m a
forall (m :: * -> *) a. Return m => a -> m a
return 𝑂 b
forall a. 𝑂 a
None
    Some a
x  b -> 𝑂 b
forall a. a -> 𝑂 a
Some (b -> 𝑂 b) -> m b -> m (𝑂 b)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ a -> m b
f a
x
instance (Null a)  Null (𝑂 a) where 
  null :: 𝑂 a
null = a -> 𝑂 a
forall a. a -> 𝑂 a
Some a
forall a. Null a => a
null
instance (Append a)  Append (𝑂 a) where
  𝑂 a
None ⧺ :: 𝑂 a -> 𝑂 a -> 𝑂 a
 𝑂 a
_ = 𝑂 a
forall a. 𝑂 a
None
  𝑂 a
_  𝑂 a
None = 𝑂 a
forall a. 𝑂 a
None
  Some a
x  Some a
y = a -> 𝑂 a
forall a. a -> 𝑂 a
Some (a -> 𝑂 a) -> a -> 𝑂 a
forall a b. (a -> b) -> a -> b
$ a
x a -> a -> a
forall a. Append a => a -> a -> a
 a
y
instance (Monoid a)  Monoid (𝑂 a)

instance ToIter a (𝑂 a) where iter :: 𝑂 a -> 𝐼 a
iter = 𝑂 a -> 𝐼 a
forall a. 𝑂 a -> 𝐼 a
iter𝑂

iter𝑂  𝑂 a  𝐼 a
iter𝑂 :: forall a. 𝑂 a -> 𝐼 a
iter𝑂 𝑂 a
xO = (forall b. (a -> b -> (b -> b) -> b) -> b -> (b -> b) -> b) -> 𝐼 a
forall a.
(forall b. (a -> b -> (b -> b) -> b) -> b -> (b -> b) -> b) -> 𝐼 a
𝐼 ((forall b. (a -> b -> (b -> b) -> b) -> b -> (b -> b) -> b)
 -> 𝐼 a)
-> (forall b. (a -> b -> (b -> b) -> b) -> b -> (b -> b) -> b)
-> 𝐼 a
forall a b. (a -> b) -> a -> b
HS.$ \ a -> b -> (b -> b) -> b
f b
i b -> b
𝓀  case 𝑂 a
xO of
    𝑂 a
None  b -> b
𝓀 b
i
    Some a
x  a -> b -> (b -> b) -> b
f a
x b
i b -> b
𝓀

instance 𝑂 a  (()  a) where
  isoto :: 𝑂 a -> () ∨ a
isoto = \case
    𝑂 a
None  () -> () ∨ a
forall a b. a -> a ∨ b
Inl ()
    Some a
x  a -> () ∨ a
forall a b. b -> a ∨ b
Inr a
x
  isofr :: (() ∨ a) -> 𝑂 a
isofr = \case
    Inl ()  𝑂 a
forall a. 𝑂 a
None
    Inr a
x  a -> 𝑂 a
forall a. a -> 𝑂 a
Some a
x

elim𝑂  (()  b)  (a  b)  𝑂 a  b
elim𝑂 :: forall b a. (() -> b) -> (a -> b) -> 𝑂 a -> b
elim𝑂 () -> b
f a -> b
g = \case
  𝑂 a
None  () -> b
f ()
  Some a
x  a -> b
g a
x

isNone  𝑂 a  𝔹
isNone :: forall a. 𝑂 a -> 𝔹
isNone = \case
  𝑂 a
None  𝔹
True
  Some a
_  𝔹
False

isSome  𝑂 a  𝔹
isSome :: forall a. 𝑂 a -> 𝔹
isSome = \case
  𝑂 a
None  𝔹
False
  Some a
_  𝔹
True

ifNone  a  𝑂 a  a
ifNone :: forall a. a -> 𝑂 a -> a
ifNone a
i = \case
  𝑂 a
None  a
i
  Some a
x  a
x

ifNoneZ  a  𝑂 a  a
ifNoneZ :: forall a. a -> 𝑂 a -> a
ifNoneZ ~a
i = \case
  𝑂 a
None  a
i
  Some a
x  a
x

ifNoneM  (Return m)  m a  𝑂 a  m a
ifNoneM :: forall (m :: * -> *) a. Return m => m a -> 𝑂 a -> m a
ifNoneM m a
xM = \case
  𝑂 a
None  m a
xM
  Some a
x  a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Return m => a -> m a
return (a -> m a) -> a -> m a
forall a b. (a -> b) -> a -> b
$ a
x

ifNoneMZ  (Return m)  m a  𝑂 a  m a
ifNoneMZ :: forall (m :: * -> *) a. Return m => m a -> 𝑂 a -> m a
ifNoneMZ ~m a
xM = \case
  𝑂 a
None  m a
xM
  Some a
x  a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Return m => a -> m a
return (a -> m a) -> a -> m a
forall a b. (a -> b) -> a -> b
$ a
x

first  𝑂 a  𝑂 a  𝑂 a
first :: forall a. 𝑂 a -> 𝑂 a -> 𝑂 a
first = \case
  𝑂 a
None  𝑂 a -> 𝑂 a
forall a. a -> a
id
  Some a
x  𝑂 a -> 𝑂 a -> 𝑂 a
forall a b. a -> b -> a
const (𝑂 a -> 𝑂 a -> 𝑂 a) -> 𝑂 a -> 𝑂 a -> 𝑂 a
forall a b. (a -> b) -> a -> b
$ a -> 𝑂 a
forall a. a -> 𝑂 a
Some a
x

last  𝑂 a  𝑂 a  𝑂 a
last :: forall a. 𝑂 a -> 𝑂 a -> 𝑂 a
last = (𝑂 a -> 𝑂 a -> 𝑂 a) -> 𝑂 a -> 𝑂 a -> 𝑂 a
forall a b c. (a -> b -> c) -> b -> a -> c
flip 𝑂 a -> 𝑂 a -> 𝑂 a
forall a. 𝑂 a -> 𝑂 a -> 𝑂 a
first