module Prelude.Function where

open import Prelude.Level
open import Prelude.Notation

----------------------------------------------------------------------
-- Identity function
----------------------------------------------------------------------
instance
  FuncIdentity : {l : Level}{A : Set l}  Identity (A  A)
  id  FuncIdentity  x = x

----------------------------------------------------------------------
-- Non-dependent function composition
----------------------------------------------------------------------
instance
  FuncComp :
    {l m n : Level}
    {A : Set l}
    {B : Set m}
    {C : Set n}
     ---------------------------------
    Composition (B  C) (A  B) (A  C)
  _∘_  FuncComp  g f x = g (f x)

----------------------------------------------------------------------
-- Dependent function composition
----------------------------------------------------------------------
infixr 5 _○_
_○_ :
  {l m n : Level}
  {A : Set l}
  {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)

----------------------------------------------------------------------
-- Case expressions
----------------------------------------------------------------------
infix 1 case_of_
case_of_ :
  {l m : Level}
  {A : Set l}
  (x : A)
  {B : A  Set m}
   -------------------
  ((x : A)  B x)  B x

case x of f  = f x

infix 1 case_returning_of_
case_returning_of_ :
  {l m : Level}
  {A : Set l}
  (x : A)
  (B : A  Set m)
   -------------------
  ((x : A)  B x)  B x

case x returning _ of f = f x