open import Paths using (=)
open import Data::Option::Core

variable A B C : Type

// ----- functional -----
def fmap {A B : Type} ⇒ map {A} {B}

def pure (x : A) : Option Asome x

def infixl <*> (f : Option (AB)) (x : Option A) : Option B
| none  , _ ⇒ none
| some f, xmap f x

def infixl <|> (l r : Option A) : Option A
| none  , rr
| some l, _ ⇒ some l
  tighter =
  looser  <*>

// ----- monadic -----

def return {A : Type} ⇒ pure {A}

def join (x : Option (Option A)) : Option A
| nonenone
| some x'x'

def infixl >>= (l : Option A) (f : AOption B) : Option Bjoin (fmap f l)
tighter =

def infixl >> (l : Option A) (r : Option B) : Option Bdo { l, r }
tighter =