-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Reifies arbitrary terms into types that can be reflected back into terms
--
-- This package provides an implementation of the ideas presented in the
-- paper "Functional Pearl: Implicit Configurations" by Oleg Kiselyov and
-- Chung-chieh Shan. However, the API has been streamlined to improve
-- performance.
--
-- The original paper can be obtained from
-- http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf.
--
-- Changes in 1.1.6:
--
--
-- - Relaxed an unnecessary strictness annotation in the fast
-- implementation
--
--
-- Changes in 1.1.5:
--
--
-- - Both implementations now work on Hugs; the fast implementation
-- ascends from the ranks of completely unportable black magic to being
-- merely mostly unportable black magic.
--
--
-- Changes from 0.5 to 1.1:
--
--
-- - Much faster implementation available that is about 50 times
-- faster than 0.9 and which runs purely on black magic. This version is
-- now used by default. To turn it off install with the slow
-- flag. If you encounter a problem with the implementation, please
-- contact the author.
-- - Removed ReifiedNum, reflectNum, and
-- reifyIntegral; reify and reflect are about
-- 3 orders of magnitude faster than the special case combinators
-- were.
--
--
-- Changes in 0.5:
--
--
-- - Generalized the type signatures in reflect to allow you to pass
-- any type with kind * -> * wrapped around the desired type
-- as the phantom type argument rather than just a Proxy.
--
--
-- Changes in 0.4:
--
--
-- - Converted from Data.Tagged to using Data.Proxy for
-- reflection. This reduces the need for helper functions and scoped type
-- variables in user code.
--
@package reflection
@version 1.1.6
-- | Reifies arbitrary terms at the type level. Based on the Functional
-- Pearl: Implicit Configurations paper by Oleg Kiselyov and Chung-chieh
-- Shan.
--
-- http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf
--
-- The approach from the paper was modified to work with Data.Proxy and
-- to cheat by using knowledge of GHC's internal representations by
-- Edward Kmett and Elliott Hird.
--
-- Usage comes down to two combinators, reify and reflect.
--
--
-- >>> reify 6 (\p -> reflect p + reflect p)
-- 12
--
--
-- The argument passed along by reify is just a data Proxy t =
-- Proxy, so all of the information needed to reconstruct your value
-- has been moved to the type level. This enables it to be used when
-- constructing instances (see examples/Monoid.hs).
module Data.Reflection
class Reifies s a | s -> a
reflect :: Reifies s a => proxy s -> a
-- | Reify a value at the type level, to be recovered with reflect.
reify :: a -> (forall s. Reifies s a => Proxy s -> r) -> r