Library Prelude.Control.Identity


Generalizable All Variables.

From Prelude Require Import Control Equality.

#[local]
Open Scope prelude_scope.

Definition identity_equal `{Equality a} (x y : id a) : Prop := x == y.

Instance id_Equality `{Equality a} : Equality (id a)|1000 :=
  { equal := identity_equal
  }.

Functor


Definition identity_map {a b} (f : a -> b) (x : id a) : id b :=
  f x.

#[program, universes(polymorphic)]
Instance identity_Functor : Functor id|1000 :=
  { map := @identity_map
  }.

Next Obligation.
  reflexivity.
Qed.

Next Obligation.
  reflexivity.
Defined.

Definition identity_apply {a b} (f : id (a -> b)) (x : id a) : id b :=
  f x.

Definition identity_pure {a} (x : a) : id a := x.

#[program]
Instance identity_Applicative : Applicative id|1000 :=
  { pure := @identity_pure
  ; apply := @identity_apply
  }.

Next Obligation.
  reflexivity.
Defined.

Next Obligation.
  reflexivity.
Defined.

Next Obligation.
  reflexivity.
Defined.

Next Obligation.
  reflexivity.
Defined.

Next Obligation.
  reflexivity.
Defined.

Definition identity_bind {a b} (x : id a) (f : a -> id b) : id b :=
  f x.

#[program]
Instance identity_Monad : Monad id|1000 :=
  { bind := @identity_bind
  }.

Next Obligation.
  reflexivity.
Defined.

Next Obligation.
  reflexivity.
Defined.

Next Obligation.
  reflexivity.
Defined.

Next Obligation.
  reflexivity.
Defined.