------------------------------------------------------------------------
-- The Agda standard library
--
-- Some unit types
------------------------------------------------------------------------

module Data.Unit.NonEta where

open import Level

------------------------------------------------------------------------
-- A unit type defined as a data-type

-- The ⊤ type (see Data.Unit) comes with η-equality, which is often
-- nice to have, but sometimes it is convenient to be able to stop
-- unfolding (see "Hidden types" below).

data Unit : Set where
  unit : Unit

------------------------------------------------------------------------
-- Hidden types

-- "Hidden" values.

Hidden :  {a}  Set a  Set a
Hidden A = Unit  A

-- The hide function can be used to hide function applications. Note
-- that the type-checker doesn't see that "hide f x" contains the
-- application "f x".

hide :  {a b} {A : Set a} {B : A  Set b} 
       ((x : A)  B x)  ((x : A)  Hidden (B x))
hide f x unit = f x

-- Reveals a hidden value.

reveal :  {a} {A : Set a}  Hidden A  A
reveal f = f unit