{-# LANGUAGE CPP, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, TemplateHaskell, DeriveDataTypeable, UndecidableInstances #-}
module Happstack.Data.Proxy where

import Happstack.Data.DeriveAll
import Happstack.Data.Default

-- | Proxy is empty and is used as a transport of a phantom type
$(deriveAll [''Read,''Show,''Default]
  [d| data Proxy t = Proxy |]
 )

-- | Creates the Proxy with a type matching the argument
proxy :: t -> Proxy t
proxy _ = Proxy

-- | Returns bottom
unProxy :: Proxy t -> t
unProxy _ = undefined

-- | Acts as id except for providing type restrictions
asProxyType :: t -> Proxy t -> t
asProxyType t _ = t