uniplate-1.2.0.1: Uniform type generic traversals.

Data.Generics.PlateTypeable

Contents

Description

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

Instances

PlateAll Bool to 
PlateAll Char to 
PlateAll Double to 
PlateAll Float to 
PlateAll Int to 
PlateAll Integer to 
PlateAll () to 
(PlateAll from to, Typeable from, Typeable to, Uniplate to) => PlateAll [from] to 
(PlateAll from to, Typeable from, Typeable to, Uniplate to) => PlateAll (Maybe from) to 
(PlateAll a to, Typeable a, PlateAll b to, Typeable b, Typeable to, Uniplate to) => PlateAll (Either a b) to 
(PlateAll a to, Typeable a, PlateAll b to, Typeable b, Typeable to, Uniplate to) => PlateAll (a, b) to 
(PlateAll a to, Typeable a, PlateAll b to, Typeable b, PlateAll c to, Typeable c, Typeable to, Uniplate to) => PlateAll (a, b, c) to 
(PlateAll a to, Typeable a, PlateAll b to, Typeable b, PlateAll c to, Typeable c, PlateAll d to, Typeable d, Typeable to, Uniplate to) => PlateAll (a, b, c, d) to 
(PlateAll a to, Typeable a, PlateAll b to, Typeable b, PlateAll c to, Typeable c, PlateAll d to, Typeable d, PlateAll e to, Typeable e, Typeable to, Uniplate to) => PlateAll (a, b, c, d, e) to 

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.