{-# LANGUAGE NoImplicitPrelude #-}

-- | A version of 'Data.TMap.TMap' parametrized by an interpretation @f@. This
-- sort of parametrization may be familiar to users of @vinyl@ records.
--
-- @'TypeRepMap' f@ is a more efficient replacement for @DMap
-- 'Type.Reflection.TypeRep' f@ (where @DMap@ is from the @dependent-map@
-- package).
--
-- Here is an example of using 'Prelude.Maybe' as an interpretation, with a
-- comparison to 'Data.TMap.TMap':
--
-- @
--      'Data.TMap.TMap'              'TypeRepMap' 'Prelude.Maybe'
-- --------------       -------------------
--  Int  -> 5             Int  -> Just 5
--  Bool -> True          Bool -> Nothing
--  Char -> \'x\'           Char -> Just \'x\'
-- @
--
-- In fact, a 'Data.TMap.TMap' is defined as 'TypeRepMap'
-- 'Data.Functor.Identity'.
--
-- Since 'Type.Reflection.TypeRep' is poly-kinded, the interpretation can use
-- any kind for the keys. For instance, we can use the 'GHC.TypeLits.Symbol'
-- kind to use 'TypeRepMap' as an extensible record:
--
-- @
-- newtype Field name = F (FType name)
--
-- type family FType (name :: Symbol) :: Type
-- type instance FType "radius" = Double
-- type instance FType "border-color" = RGB
-- type instance FType "border-width" = Double
--
--        'TypeRepMap' Field
-- --------------------------------------
--  "radius"       -> F 5.7
--  "border-color" -> F (rgb 148 0 211)
--  "border-width" -> F 0.5
-- @
--
module Data.TypeRepMap
       ( -- * Map type
         TypeRepMap()

         -- * Construction
       , empty
       , one

         -- * Modification
       , insert
       , delete
       , adjust
       , hoist
       , hoistA
       , hoistWithKey
       , unionWith
       , union

         -- * Query
       , lookup
       , member
       , size
       , keys

         -- * 'IsList'
       , WrapTypeable (..)
       ) where

import Data.TypeRepMap.Internal