{-# LANGUAGE Rank2Types #-}

module Data.Proof.Named
  ( Named
  , name
  , unWrapNamed
  ) where

newtype Named n a = Named { forgetName :: a } deriving Show

name :: a -> ( forall name. Named name a -> r ) -> r
name x f = f ( Named x )

unWrapNamed :: Named n a -> a
unWrapNamed = forgetName