{-# LANGUAGE NoImplicitPrelude #-}

{- |
Module                  : Data.TypeRepMap
Copyright               : (c) 2017-2022 Kowainik
SPDX-License-Identifier : MPL-2.0
Maintainer              : Kowainik <xrom.xkov@gmail.com>
Stability               : Stable
Portability             : Portable

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
       , alter
       , hoist
       , hoistA
       , hoistWithKey
       , unionWith
       , union
       , intersectionWith
       , intersection

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

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

import Data.TypeRepMap.Internal