----------------------------------------------------------------------------- -- | -- Module : Data.Barbie.Bare -- -- Sometimes one needs a type like -- @Barbie 'Data.Functor.Identity.Identity'@ and it may feel like -- a second-class record type, where one needs to -- unpack values in each field. For those cases, we can leverage on -- closed type-families: -- -- @ -- data 'Bare' -- data 'Covered' -- -- type family 'Wear' t f a where -- 'Wear' 'Bare' f a = a -- 'Wear' 'Covered' f a = f a -- -- data SignUpForm t f -- = SignUpForm' -- { username :: 'Wear' t f 'String', -- , password :: 'Wear' t f 'String' -- , mailingOk :: 'Wear' t f 'Bool' -- } -- instance 'FunctorB' (SignUpForm 'Covered') -- instance 'TraversableB' (SignUpForm 'Covered') -- ..., -- instance 'BareB' SignUpForm -- -- type SignUpRaw = SignUpForm 'Maybe' -- type SignUpData = SignUpForm 'Bare' -- -- formData = SignUpForm "jbond" "shaken007" False :: SignUpData -- @ ---------------------------------------------------------------------------- module Data.Barbie.Bare ( -- * Bare values Wear , Bare , Covered -- * Covering and stripping , BareB(bstrip, bcover) , bstripFrom , bcoverWith ) where import Data.Barbie.Internal.Bare ( Wear, Bare, Covered , BareB(..) , bstripFrom, bcoverWith )