{-# LANGUAGE CPP #-}
#ifdef LANGUAGE_DataKinds
{-# LANGUAGE PolyKinds #-}
#endif
{-# LANGUAGE TypeOperators #-}
module Data.Proxy
       ( Proxy (..)
       , proxy
       , reproxy
       , reproxyRep
       , reproxyK1
       , reproxyM1
       , reproxyFst
       , reproxySnd
       ) where

import GHC.Generics

data Proxy a = Proxy

proxy :: a -> Proxy a
proxy _ = Proxy
{-# INLINE proxy #-}

reproxy :: t a -> Proxy b
reproxy _ = Proxy
{-# INLINE reproxy #-}

reproxyRep :: t a -> Proxy (Rep a p)
reproxyRep = reproxy
{-# INLINE reproxyRep #-}

reproxyK1 :: t (K1 i c p) -> Proxy c
reproxyK1 = reproxy
{-# INLINE reproxyK1 #-}

reproxyM1 :: t (M1 i c f p) -> Proxy (f p)
reproxyM1 = reproxy
{-# INLINE reproxyM1 #-}

reproxyFst :: t ((f :*: g) p) -> Proxy (f p)
reproxyFst = reproxy
{-# INLINE reproxyFst #-}

reproxySnd :: t ((f :*: g) p) -> Proxy (g p)
reproxySnd = reproxy
{-# INLINE reproxySnd #-}