barbies-layered-0.1.0.0: Barbies with layered clothes.
Safe HaskellNone
LanguageHaskell2010

Barbies.Bare.Layered

Synopsis

Bare values

type family Wear t (f :: Type -> Type) a where ... #

The Wear type-function allows one to define a Barbie-type as

data B t f
  = B { f1 :: Wear t f Int
      , f2 :: Wear t f Bool
      }

This gives rise to two rather different types:

  • B Covered f is a normal Barbie-type, in the sense that f1 :: B Covered f -> f Int, etc.
  • B Bare f, on the other hand, is a normal record with no functor around the type:
B { f1 :: 5, f2 = True } :: B Bare f

Equations

Wear Bare f a = a 
Wear Covered f a = f a 
Wear (Param _1 t) f a = Wear t f a 
Wear t _1 _2 = TypeError (('Text "`Wear` should only be used with " :<>: 'Text "`Bare` or `Covered`.") :$$: ((('Text "`" :<>: 'ShowType t) :<>: 'Text "`") :<>: 'Text " is not allowed in this context.")) :: Type 

data Bare #

data Covered #

Covering and stripping

class FunctorB (b Covered) => BareB b where Source #

Class of Barbie-types defined using Wear and can therefore have Bare versions. Must satisfy:

bcover . bstrip = id
bstrip . bcover = id

bstripFrom :: (BareB b, Functor f) => (forall a. f a -> a) -> b Covered f -> b Bare Identity Source #

Generalization of bstrip to arbitrary functors.

bcoverWith :: (BareB b, Functor f) => (forall a. a -> f a) -> b Bare Identity -> b Covered f Source #

Generalization of bcover to arbitrary functors.