\import Logic
\import Meta
\import Paths
\import Paths.Meta
\import Set
\record Partial \extends BaseSet
| isDefined : \Prop
| \coerce value : isDefined -> E
\where {
\lemma partial-ext {X : \Set} {u v : Partial X} (d : u.isDefined <-> v.isDefined) (e : \Pi (p : u.isDefined) -> u p = v (d.1 p)) : u = v
=> exts (<->_=.1 d, \lam p => e p *> pmap v prop-pi)
}
\func defined {X : \Set} (x : X) : Partial X \cowith
| isDefined => \Sigma
| value _ => x
\func undefined {X : \Set} : Partial X \cowith
| isDefined => Empty
| value => \case __
\lemma defined-ext {X : \Set} {u : Partial X} {x : X} (d : u.isDefined) (p : u d = x) : u = defined x
=> Partial.partial-ext (\lam _ => (), \lam _ => d) \lam q => pmap u prop-pi *> p
\where {
\protected \lemma isDefined (p : u = defined x) : u.isDefined
=> transportInv (\lam x => Partial.isDefined {x}) p ()
\protected \lemma value (p : u = defined x) : u (isDefined p) = x
=> transportInv (\lam (v : Partial X) => \Pi (p : v.isDefined) -> v p = x) p (\lam _ => idp) (isDefined p)
}
\lemma undefined-ext {X : \Set} {u : Partial X} (d : Not u.isDefined) : u = undefined
=> Partial.partial-ext (d,absurd) \lam p => absurd (d p)