open import Prelude
open import Cubical.Foundations.HLevels

module Definitions (I : Type) where

IType : Type₁
IType = I → Type

infixr 5 _I→_
_I→_ : IType → IType → IType
(X I→ Y) i = X i → Y i

infixr 5 _i→_
_i→_ : IType → IType → Type
X i→ Y = ∀ (i : I) → (X I→ Y) i

i-idfun : ∀ {A : IType} → A i→ A
i-idfun = λ _ → idfun _

infixl 10 _i»_ 
_i»_ : {A B C : IType} → A i→ B → B i→ C → A i→ C
_i»_ f g i = f i » g i

isISet : IType → Type
isISet X = ∀ i → isSet (X i)

ISet = Σ IType isISet

_IS→_ : ISet → ISet → ISet
(X IS→ Y) .fst = X .fst I→ Y .fst
(X IS→ Y) .snd i = isSet→ (Y .snd i)

_is→_ : ISet → ISet → Type
X is→ Y = X .fst i→ Y .fst