{-# OPTIONS --cubical-compatible #-}
module Terra.Classes.Contractible where
open import Terra.Data.Level.Variables
open import Terra.Data.Equality
open import Terra.Data.Function.Postulates

record Contractible (A : Set ) : Set  where
  constructor contr
  field
    contract : (a b : A) -> a  b

open Contractible {{...}} public

contr-pullback : {A : Set } {B : Set ℓ′} -> Contractible B -> Contractible (A -> B)
contr-pullback (contr contract) = contr  a b  extensionality λ x   contract (a x) (b x))

instance
  contr-pullback-instance : {A : Set } {B : Set ℓ′} -> {{Contractible B}} -> Contractible (A -> B)
  contr-pullback-instance {{c}} = contr-pullback c