uniplate-1.6: Help writing simple, concise and fast generic operations.

Data.Generics.PlateTypeable

Contents

Description

RECOMMENDATION: Use Data.Generics.Uniplate.Typeable instead.

This module supplies a method for writing Biplate instances more easily.

To take an example:

 data Expr = Var Int | Neg Expr | Add Expr Expr

 instance Typeable Expr where ...

 instance (Typeable a, Uniplate a) => PlateAll Expr a where
   plateAll (Var x  ) = plate Var |- x
   plateAll (Neg x  ) = plate Neg |+ x
   plateAll (Add x y) = plate Add |+ x |+ y

 instance Uniplate Expr where
   uniplate = uniplateAll

Synopsis

Documentation

The Class

class PlateAll from to whereSource

This class represents going from the container type to the target.

This class should only be constructed with plate, |+ and |-

Methods

plateAll :: from -> Type from toSource

uniplateAll :: PlateAll a b => a -> (Str b, Str b -> a)Source

This function is used to write a Uniplate instance from a PlateAll one

The Combinators

plate :: from -> Type from toSource

The main combinator used to start the chain.

The following rule can be used for optimisation:

 plate Ctor |- x == plate (Ctor x)

(|+) :: (Typeable item, Typeable to, PlateAll item to) => Type (item -> from) to -> item -> Type from toSource

the field to the right may contain the target.

(|-) :: Type (item -> from) to -> item -> Type from toSource

The field to the right does not contain the target. This can be used as either an optimisation, or more commonly for excluding primitives such as Int.