-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Functional Pearl: Implicit Configurations
--
-- 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 modified to use
-- TypeFamilies and the implementation 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.0:
--
--
-- - 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 implementation, please contact the
-- author.
--
--
-- Changes in 0.9:
--
--
-- - Faster internal implementation, about 40 percent faster than
-- 0.8.
-- - Removed ReifiedNum, reflectNum, and
-- reifyIntegral; reify and reflect are
-- considerably faster than the special case combinators were.
--
--
-- Changes in 0.8:
--
--
-- - Switched to using type families to avoid a problem where the user
-- could cast Proxy (s a) -> Proxy (s b) and get back a
-- values with the wrong type under the API in effect from 0.6. This API
-- yields a much nicer example as well.
-- - Removed reflectT as it no longer makes sense.
-- - Added a more advanced example example/Constraints.hs
-- using constraint kinds.
--
--
-- Changes in 0.7:
--
--
-- - Uses a much simpler construction where reify now converts
-- a StablePtr to an IntPtr and reifies that directly
-- as an integral type rather than serializing and storing the StablePtr
-- as a list of bytes as proposed in the original paper.
-- - Removed ReifiedStorable and ReifiedNums.
-- - Since we have so many fewer classes now,
-- Data.Reflection.Internal was merged back into
-- Data.Reflection
--
--
-- Changes in 0.6:
--
--
-- - Removed the dependency on multiparameter type classes, functional
-- dependencies, and flexible instances, by making Reifies a
-- single parameter type class in the same fashion as
-- ReifiesStorable.
-- - Moved the building blocks to Data.Reflection.Internal to
-- reduce API clutter.
-- - Added reflectT
--
--
-- 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.0
-- | 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 reduces to using two combinators, reify and
-- reflect.
--
--
-- ghci> reify 6 (\p -> reflect p + reflect p) :: Int
-- 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 Reified s where type family Reflected s
reflect :: Reified s => p s -> Reflected s
reify :: a -> (forall s. (Reified s, Reflected s ~ a) => Proxy s -> w) -> w