module linear.RawIso where

open import Function
open import Data.Product
open import Relation.Nullary

record RawIso (A B : Set) : Set where
  constructor mkRawIso
  field
    push : A  B
    pull : B  A
open RawIso public

infixl 2 _<$>_
_<$>_ : {A B : Set} (f : RawIso A B)  Dec A  Dec B
f <$> yes p = yes (push f p)
f <$> no ¬p = no (¬p  pull f)

infixr 3 _<*>_
_<*>_ : {A B : Set}  Dec A  Dec B  Dec (A × B)
yes a <*> yes b = yes (a , b)
no ¬a <*> b     = no (¬a  proj₁)
a     <*> no ¬b = no (¬b  proj₂)