| Portability | non-portable (uses Data.Generics.Basics) |
|---|---|
| Stability | experimental |
| Maintainer | rasfar@gmail.com |
| Safe Haskell | None |
SAI.Data.Generics.Shape.SYB
Contents
Description
This package provides SYB shape support: generic mapping to homogeneous types, and related features. Complements existing Uniplate and TH shape libraries. See http://www.fremissant.net/shape-syb for more information.
The present module provides the main types and functions.
- type Homo r = Rose r
- type Hetero = Homo Dynamic
- type Bi r = Homo (Dynamic, r)
- type Shape = Homo ()
- type HomoM r = Homo (Maybe r)
- type BiM r = Bi (Maybe r)
- type Rose = Tree
- ghom :: forall r d. Data d => GenericQ r -> d -> Homo r
- ghomK :: forall r d. Data d => (r -> r -> r) -> GenericQ r -> d -> Homo r
- ghomDyn :: forall d. Data d => d -> Hetero
- ghomBi :: forall r d. Data d => GenericQ r -> d -> Bi r
- unGhomDyn :: Typeable a => Hetero -> a
- unGhomBi :: Typeable a => Bi r -> a
- biToHomo :: Bi r -> Homo r
- biToHetero :: Bi r -> Hetero
- heteroToBi :: forall r d. (Data d, Typeable d, Typeable r) => r -> (d -> r) -> Hetero -> Bi r
- liftHomoM :: Homo r -> HomoM r
- liftBiM :: Bi r -> BiM r
- unliftHomoM :: r -> HomoM r -> Homo r
- unliftBiM :: r -> BiM r -> Bi r
- gempty :: forall r d. (Typeable r, Data d) => d -> BiM r
- grefine :: forall r d. (Typeable r, Data d, Typeable d) => (d -> Maybe r) -> BiM r -> BiM r
- gaccum :: forall r d. (Typeable r, Data d, Typeable d) => (r -> r -> r) -> (d -> Maybe r) -> BiM r -> BiM r
- shapeOf :: forall d. Data d => d -> Shape
- sizeOf :: forall d. Data d => d -> Int
- symmorphic :: forall d1 d2. (Data d1, Data d2) => d1 -> d2 -> Bool
- (~~) :: forall d1 d2. (Data d1, Data d2) => d1 -> d2 -> Bool
- weightedShapeOf :: forall d. Data d => d -> Homo Int
- weightedRose :: Rose r -> Rose (r, Int)
- weightedRoseJust :: Rose (Maybe r) -> Rose (Maybe r, Int)
- sizeOfRose :: Rose a -> Int
- zipRose :: Rose r -> Rose s -> Rose (r, s)
- unzipRose :: Rose (r, s) -> (Rose r, Rose s)
- zipBi :: Bi r -> Bi s -> Bi (r, s)
- unzipBi :: Bi (r, s) -> (Bi r, Bi s)
- zip :: (Applicative f, Functor f) => (f a, f b) -> f (a, b)
- unzip :: Functor f => f (a, b) -> (f a, f b)
- showHomo :: Show r => Rose r -> String
- showHomoM :: Show r => Rose (Maybe r) -> String
- showAsParens :: Homo r -> String
- showAsParensBool :: Homo Bool -> String
- showAsParensEnriched :: Show r => Homo r -> String
- showAsParensEnrichedM :: Show r => HomoM r -> String
- showDyn :: Dynamic -> String
- showHetero :: Hetero -> String
- showBi :: Show r => Bi r -> String
- data Tree a = Node a (Forest a)
- type Forest a = [Tree a]
Types
Rose Tree Type
Homomorphisms
ghom :: forall r d. Data d => GenericQ r -> d -> Homo rSource
Map an arbitrary data constructor application expression to
a homogeneous representation preserving structure.
This is a one-way trip; what value information is preserved
depends on the mapping function you provide.
Use ghomDyn or ghomBi if you need to be able
to recover the original, heterogeneous data.
ghomK :: forall r d. Data d => (r -> r -> r) -> GenericQ r -> d -> Homo rSource
Like ghom, but use a custom combining function, instead of
the default (\r _->r).
ghomDyn :: forall d. Data d => d -> HeteroSource
Uses Data.Dynamic to support mutiple types homogeneously.
Unlike ghom, this is invertible (unGhomDyn).
Inverses where possible
Conversions
These conversion functions should obey at least the following laws.
ghomf =biToHomo.ghomBif
biToHetero.ghomBig =biToHetero.ghomBif
ghomBif =heteroToBif .ghomDyn
ghomBig =heteroToBig .biToHetero.ghomBif
biToHetero :: Bi r -> HeteroSource
Drops the homogeneous component (type r).
Conversions concerning lifted types
unliftHomoM :: r -> HomoM r -> Homo rSource
unliftBiM :: r -> BiM r -> Bi rSource
Analogous to unliftHomoM.
Progressive refinement and accumulation
gempty :: forall r d. (Typeable r, Data d) => d -> BiM rSource
Sets up a using a default BiM rGenericQ which
assigns all values to Nothing.
Use an expression type signature at the call site, to constrain
the type r (the usual trick)
( gempty x :: BiM ( Int , Data.IntMap Text , [Float] ) )
so your choice type r is a triple, but the value
returned contains BiM rNothing at every node. This prepares it
for refinement and accumulation.
grefine :: forall r d. (Typeable r, Data d, Typeable d) => (d -> Maybe r) -> BiM r -> BiM rSource
Given a monomorphic function you provide, returning r,
automatically makes a from this. It then maps
the generic query over the source polytypic tree, the latter
being recovered from the GenericQ rDynamic component of the BiM.
The target is updated with write-once semantics enforced;
that is to say, grefine will throw an exception if it finds
a Just already present at any place in the result tree that
it would update.
gaccum :: forall r d. (Typeable r, Data d, Typeable d) => (r -> r -> r) -> (d -> Maybe r) -> BiM r -> BiM rSource
Like grefine, but rather than throw exception, it
takes a combining function argument to cope with that situation.
For convenience
shapeOf :: forall d. Data d => d -> ShapeSource
Trivial homomorphism that discards all value information.
symmorphic :: forall d1 d2. (Data d1, Data d2) => d1 -> d2 -> BoolSource
Compare two general polytypic values for shape equality.
(~~) :: forall d1 d2. (Data d1, Data d2) => d1 -> d2 -> BoolSource
Operator synonymous with symmorphic.
weightedShapeOf :: forall d. Data d => d -> Homo IntSource
Weight of a node is defined as the number of descendants, plus 1.
weightedRose :: Rose r -> Rose (r, Int)Source
sizeOfRose :: Rose a -> IntSource
Number of nodes in a rose tree.
zipRose :: Rose r -> Rose s -> Rose (r, s)Source
Combine two rose trees with identical shape, by tupling their values.
zip :: (Applicative f, Functor f) => (f a, f b) -> f (a, b)Source
Showing values
Pretty-printing of rose trees, including compact representations. Also, show functions for a subset of Dynamic values, which show the value and not just <<type>>.
showAsParens :: Homo r -> StringSource
showAsParensBool :: Homo Bool -> StringSource
showAsParensEnriched :: Show r => Homo r -> StringSource
showAsParensEnrichedM :: Show r => HomoM r -> StringSource
showHetero :: Hetero -> StringSource
Re-exported from Data.Tree
data Tree a
Multi-way trees, also known as rose trees.