{-# LANGUAGE TypeFamilies #-} module Data.Barbie.Internal.Wear ( Bare, Wear ) where import Data.Barbie.Internal.Generics(Target, W) -- | The 'Wear' type-function allows one to define a Barbie-type as -- -- @ -- data B f -- = B { f1 :: 'Wear' f 'Int' -- , f2 :: 'Wear' f 'Bool' -- } -- @ -- -- This way, one can use 'Bare' as a phantom that denotes no functor -- around the typw: -- -- -- @ -- B { f1 :: 5, f2 = 'True' } :: B 'Bare' -- @ type family Wear f a where Wear Bare a = a Wear (Target f) a = Target (W f) a Wear f a = f a -- | 'Bare' is the only type such that @'Wear' 'Bare' a ~ a'@. data Bare a