module Function where

open import Level

----------------------------------------------------------------------
-- Identity function
----------------------------------------------------------------------
id :
 { : Level}
 {A : Set }
  ---------
 A  A
id x = x

----------------------------------------------------------------------
-- Composition
----------------------------------------------------------------------
infixr 5 _∘_ _∘₂_
_∘_ :
  { m n : Level}
  {A : Set }
  {B : A  Set m}
  {C : (x : A)  B x  Set n}
  (g : {x : A}(y : B x)  C x y)
  (f : (x : A)  B x)
   ----------------------------
  (x : A)  C x (f x)
(g  f) x = g (f x)

_∘₂_ :
  {k  m n : Level}
  {A : Set k}
  {B : Set }
  {C : Set m}
  {D : Set n}
  (g : C  D)
  (f : A  B  C)
   -------------
  A  B  D
(g ∘₂ f) x y = g (f x y)

----------------------------------------------------------------------
-- Constant function
----------------------------------------------------------------------
K :
  { m : Level}
  {A : Set }
  {B : Set m}
   -----------
  B  (A  B)
K y _ = y

----------------------------------------------------------------------
-- Function application
----------------------------------------------------------------------
apply :
  { m : Level}
  {A : Set }
  {B : A  Set m}
  (x : A)
   ---------------------
  ((x' : A)  B x')  B x
apply x f  = f x