open import Calf.Core.Abstract
open import Calf.Value
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Structure
module Calf.Value.Open where
β― : π± β π±
β― X = (abs : β¨ ABS β©) β X
β―' : (β¨ ABS β© β π±) β π±
β―' X = (abs : β¨ ABS β©) β X abs
Ξ·β¦ : {X : π±} β X β β― X
Ξ·β¦ x _ = x
map : {X Y : π±} β (X β Y) β β― X β β― Y
map f x⦠abs = f (x⦠abs)
Ξ·β¦-isNatural : {X Y : π±} (f : X β Y) β Ξ·β¦ β f β‘ map f β Ξ·β¦
Ξ·β¦-isNatural f = funExt Ξ» x β refl
π±β¦ : π±β
π±β¦ = TypeWithStr _ Ξ» X β isEquiv (Ξ·β¦ {X})
join : {X : π±} β β― (β― X) β β― X
join x abs = x abs abs
bind : {X Y : π±} β β― X β (X β β― Y) β β― Y
bind xβ¦ k = join (map k xβ¦)
Ξ·-isEquiv : {X : π±} β isEquiv (Ξ·β¦ {β― X})
Ξ·-isEquiv = isoToIsEquiv (iso Ξ·β¦ join sec ret)
where
sec : {X : π±} β (x : β― (β― X)) β Ξ·β¦ (join x) β‘ x
sec x = funExt Ξ» abs β funExt Ξ» q β cong (Ξ» r β x r q) (str ABS q abs)
ret : {X : π±} β (x : β― X) β join (Ξ·β¦ x) β‘ x
ret x = refl
β―-preserves-isSet : isSet X β isSet (β― X)
β―-preserves-isSet = isSetβ