packages feed

fixplate 0.1.5 → 0.1.6

raw patch · 12 files changed

+389/−37 lines, 12 filesdep ~basePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base

API changes (from Hackage documentation)

- Data.Generics.Fixplate.Attributes: unAttrib :: Attrib f a -> Attr f a
- Data.Generics.Fixplate.Base: attr :: Ann f a b -> a
- Data.Generics.Fixplate.Base: instance (Eq a, Eq (f b)) => Eq (Ann f a b)
- Data.Generics.Fixplate.Base: instance (Eq a, Eq (f b)) => Eq (CoAnn f a b)
- Data.Generics.Fixplate.Base: instance (Eq a, EqF f) => EqF (Ann f a)
- Data.Generics.Fixplate.Base: instance (Eq a, EqF f) => EqF (CoAnn f a)
- Data.Generics.Fixplate.Base: instance (Ord a, Ord (f b)) => Ord (Ann f a b)
- Data.Generics.Fixplate.Base: instance (Ord a, Ord (f b)) => Ord (CoAnn f a b)
- Data.Generics.Fixplate.Base: instance (Ord a, OrdF f) => OrdF (Ann f a)
- Data.Generics.Fixplate.Base: instance (Ord a, OrdF f) => OrdF (CoAnn f a)
- Data.Generics.Fixplate.Base: instance (Read a, ReadF f) => ReadF (Ann f a)
- Data.Generics.Fixplate.Base: instance (Show a, Show (f b)) => Show (Ann f a b)
- Data.Generics.Fixplate.Base: instance (Show a, Show (f b)) => Show (CoAnn f a b)
- Data.Generics.Fixplate.Base: instance (Show a, ShowF f) => ShowF (Ann f a)
- Data.Generics.Fixplate.Base: instance (Show a, ShowF f) => ShowF (CoAnn f a)
- Data.Generics.Fixplate.Base: instance (ShowF f, Show a) => Show (Attrib f a)
- Data.Generics.Fixplate.Base: instance (ShowF f, Show a) => Show (CoAttrib f a)
- Data.Generics.Fixplate.Base: instance Eq Hole
- Data.Generics.Fixplate.Base: instance EqF f => Eq (Mu f)
- Data.Generics.Fixplate.Base: instance Foldable f => Foldable (Ann f a)
- Data.Generics.Fixplate.Base: instance Foldable f => Foldable (Attrib f)
- Data.Generics.Fixplate.Base: instance Foldable f => Foldable (CoAnn f a)
- Data.Generics.Fixplate.Base: instance Foldable f => Foldable (CoAttrib f)
- Data.Generics.Fixplate.Base: instance Functor f => Functor (Ann f a)
- Data.Generics.Fixplate.Base: instance Functor f => Functor (Attrib f)
- Data.Generics.Fixplate.Base: instance Functor f => Functor (CoAnn f a)
- Data.Generics.Fixplate.Base: instance Functor f => Functor (CoAttrib f)
- Data.Generics.Fixplate.Base: instance Functor f => Monad (CoAttrib f)
- Data.Generics.Fixplate.Base: instance Ord Hole
- Data.Generics.Fixplate.Base: instance OrdF f => Ord (Mu f)
- Data.Generics.Fixplate.Base: instance ReadF f => Read (Mu f)
- Data.Generics.Fixplate.Base: instance ShowF f => Show (Mu f)
- Data.Generics.Fixplate.Base: instance Traversable f => Traversable (Ann f a)
- Data.Generics.Fixplate.Base: instance Traversable f => Traversable (Attrib f)
- Data.Generics.Fixplate.Base: instance Traversable f => Traversable (CoAnn f a)
- Data.Generics.Fixplate.Base: instance Traversable f => Traversable (CoAttrib f)
- Data.Generics.Fixplate.Base: unAnn :: Ann f a b -> f b
- Data.Generics.Fixplate.Base: unAttrib :: Attrib f a -> Attr f a
- Data.Generics.Fixplate.Base: unCoAttrib :: CoAttrib f a -> CoAttr f a
- Data.Generics.Fixplate.Base: unFix :: Mu f -> f (Mu f)
- Data.Generics.Fixplate.Draw: instance Show Void
- Data.Generics.Fixplate.Hash: _emptyHash :: HashValue hash -> hash
- Data.Generics.Fixplate.Hash: _hashChar :: HashValue hash -> Char -> hash -> hash
- Data.Generics.Fixplate.Hash: _hashHash :: HashValue hash -> hash -> hash -> hash
- Data.Generics.Fixplate.Hash: instance (Eq hash, EqF f) => EqF (HashAnn hash f)
- Data.Generics.Fixplate.Hash: instance (Ord hash, OrdF f) => OrdF (HashAnn hash f)
- Data.Generics.Fixplate.Hash: instance (Show hash, Show (f a)) => Show (HashAnn hash f a)
- Data.Generics.Fixplate.Hash: instance (ShowF f, Show hash) => ShowF (HashAnn hash f)
- Data.Generics.Fixplate.Hash: instance Foldable f => Foldable (HashAnn hash f)
- Data.Generics.Fixplate.Hash: instance Functor f => Functor (HashAnn hash f)
- Data.Generics.Fixplate.Hash: instance Show Void
- Data.Generics.Fixplate.Hash: instance Traversable f => Traversable (HashAnn hash f)
- Data.Generics.Fixplate.Open: instance (Functor f, ShowF f) => Show (Shape f)
- Data.Generics.Fixplate.Open: instance EqF f => Eq (Shape f)
- Data.Generics.Fixplate.Open: instance OrdF f => Ord (Shape f)
- Data.Generics.Fixplate.Open: instance Show Void
- Data.Generics.Fixplate.Trie: instance EqF f => Eq (HoleF f)
- Data.Generics.Fixplate.Trie: instance OrdF f => Ord (HoleF f)
- Data.Generics.Fixplate.Util.Hash.Class: instance (Hashable a, Hashable b) => Hashable (a, b)
- Data.Generics.Fixplate.Util.Hash.Class: instance (Hashable a, Hashable b, Hashable c) => Hashable (a, b, c)
- Data.Generics.Fixplate.Util.Hash.Class: instance (Hashable a, Hashable b, Hashable c, Hashable d) => Hashable (a, b, c, d)
- Data.Generics.Fixplate.Util.Hash.Class: instance (Hashable a, Hashable b, Hashable c, Hashable d, Hashable e) => Hashable (a, b, c, d, e)
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Bool
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Char
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Int
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Word
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Word16
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Word32
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Word64
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable Word8
- Data.Generics.Fixplate.Util.Hash.Class: instance Hashable a => Hashable [a]
- Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance Eq FNV32
- Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance HashValue FNV32
- Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance Hashable FNV32
- Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance Ord FNV32
- Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance Show FNV32
- Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance Eq FNV64
- Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance HashValue FNV64
- Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance Hashable FNV64
- Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance Ord FNV64
- Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance Show FNV64
- Data.Generics.Fixplate.Zipper: focus :: Loc f -> Mu f
- Data.Generics.Fixplate.Zipper: instance EqF f => Eq (Loc f)
- Data.Generics.Fixplate.Zipper: instance EqF f => Eq (Path f)
- Data.Generics.Fixplate.Zipper: instance ReadF f => Read (Loc f)
- Data.Generics.Fixplate.Zipper: instance ReadF f => Read (Path f)
- Data.Generics.Fixplate.Zipper: instance ShowF f => Show (Loc f)
- Data.Generics.Fixplate.Zipper: instance ShowF f => Show (Path f)
- Data.Generics.Fixplate.Zipper: path :: Loc f -> Path f
- Data.Generics.Fixplate.Zipper: unPath :: Path f -> f (Node f)
- Data.Generics.Fixplate.Zipper: unsafeMoveLeft, unsafeMoveRight :: Traversable f => Loc f -> Loc f
+ Data.Generics.Fixplate: (<$) :: Functor f => a -> f b -> f a
+ Data.Generics.Fixplate: elem :: (Foldable t, Eq a) => a -> t a -> Bool
+ Data.Generics.Fixplate: foldl' :: Foldable t => (b -> a -> b) -> b -> t a -> b
+ Data.Generics.Fixplate: foldr' :: Foldable t => (a -> b -> b) -> b -> t a -> b
+ Data.Generics.Fixplate: length :: Foldable t => t a -> Int
+ Data.Generics.Fixplate: maximum :: (Foldable t, Ord a) => t a -> a
+ Data.Generics.Fixplate: minimum :: (Foldable t, Ord a) => t a -> a
+ Data.Generics.Fixplate: null :: Foldable t => t a -> Bool
+ Data.Generics.Fixplate: product :: (Foldable t, Num a) => t a -> a
+ Data.Generics.Fixplate: sum :: (Foldable t, Num a) => t a -> a
+ Data.Generics.Fixplate: toList :: Foldable t => t a -> [a]
+ Data.Generics.Fixplate.Attributes: [unAttrib] :: Attrib f a -> Attr f a
+ Data.Generics.Fixplate.Base: [attr] :: Ann f a b -> a
+ Data.Generics.Fixplate.Base: [unAnn] :: Ann f a b -> f b
+ Data.Generics.Fixplate.Base: [unAttrib] :: Attrib f a -> Attr f a
+ Data.Generics.Fixplate.Base: [unCoAttrib] :: CoAttrib f a -> CoAttr f a
+ Data.Generics.Fixplate.Base: [unFix] :: Mu f -> f (Mu f)
+ Data.Generics.Fixplate.Base: instance (Data.Generics.Fixplate.Base.ShowF f, GHC.Show.Show a) => GHC.Show.Show (Data.Generics.Fixplate.Base.Attrib f a)
+ Data.Generics.Fixplate.Base: instance (Data.Generics.Fixplate.Base.ShowF f, GHC.Show.Show a) => GHC.Show.Show (Data.Generics.Fixplate.Base.CoAttrib f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Eq a, Data.Generics.Fixplate.Base.EqF f) => Data.Generics.Fixplate.Base.EqF (Data.Generics.Fixplate.Base.Ann f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Eq a, Data.Generics.Fixplate.Base.EqF f) => Data.Generics.Fixplate.Base.EqF (Data.Generics.Fixplate.Base.CoAnn f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Eq a, GHC.Classes.Eq (f b)) => GHC.Classes.Eq (Data.Generics.Fixplate.Base.Ann f a b)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Eq a, GHC.Classes.Eq (f b)) => GHC.Classes.Eq (Data.Generics.Fixplate.Base.CoAnn f a b)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Ord a, Data.Generics.Fixplate.Base.OrdF f) => Data.Generics.Fixplate.Base.OrdF (Data.Generics.Fixplate.Base.Ann f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Ord a, Data.Generics.Fixplate.Base.OrdF f) => Data.Generics.Fixplate.Base.OrdF (Data.Generics.Fixplate.Base.CoAnn f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Ord a, GHC.Classes.Ord (f b)) => GHC.Classes.Ord (Data.Generics.Fixplate.Base.Ann f a b)
+ Data.Generics.Fixplate.Base: instance (GHC.Classes.Ord a, GHC.Classes.Ord (f b)) => GHC.Classes.Ord (Data.Generics.Fixplate.Base.CoAnn f a b)
+ Data.Generics.Fixplate.Base: instance (GHC.Read.Read a, Data.Generics.Fixplate.Base.ReadF f) => Data.Generics.Fixplate.Base.ReadF (Data.Generics.Fixplate.Base.Ann f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Show.Show a, Data.Generics.Fixplate.Base.ShowF f) => Data.Generics.Fixplate.Base.ShowF (Data.Generics.Fixplate.Base.Ann f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Show.Show a, Data.Generics.Fixplate.Base.ShowF f) => Data.Generics.Fixplate.Base.ShowF (Data.Generics.Fixplate.Base.CoAnn f a)
+ Data.Generics.Fixplate.Base: instance (GHC.Show.Show a, GHC.Show.Show (f b)) => GHC.Show.Show (Data.Generics.Fixplate.Base.Ann f a b)
+ Data.Generics.Fixplate.Base: instance (GHC.Show.Show a, GHC.Show.Show (f b)) => GHC.Show.Show (Data.Generics.Fixplate.Base.CoAnn f a b)
+ Data.Generics.Fixplate.Base: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Generics.Fixplate.Base.Ann f a)
+ Data.Generics.Fixplate.Base: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Generics.Fixplate.Base.Attrib f)
+ Data.Generics.Fixplate.Base: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Generics.Fixplate.Base.CoAnn f a)
+ Data.Generics.Fixplate.Base: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Generics.Fixplate.Base.CoAttrib f)
+ Data.Generics.Fixplate.Base: instance Data.Generics.Fixplate.Base.EqF f => GHC.Classes.Eq (Data.Generics.Fixplate.Base.Mu f)
+ Data.Generics.Fixplate.Base: instance Data.Generics.Fixplate.Base.OrdF f => GHC.Classes.Ord (Data.Generics.Fixplate.Base.Mu f)
+ Data.Generics.Fixplate.Base: instance Data.Generics.Fixplate.Base.ReadF f => GHC.Read.Read (Data.Generics.Fixplate.Base.Mu f)
+ Data.Generics.Fixplate.Base: instance Data.Generics.Fixplate.Base.ShowF f => GHC.Show.Show (Data.Generics.Fixplate.Base.Mu f)
+ Data.Generics.Fixplate.Base: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Generics.Fixplate.Base.Ann f a)
+ Data.Generics.Fixplate.Base: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Generics.Fixplate.Base.Attrib f)
+ Data.Generics.Fixplate.Base: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Generics.Fixplate.Base.CoAnn f a)
+ Data.Generics.Fixplate.Base: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Generics.Fixplate.Base.CoAttrib f)
+ Data.Generics.Fixplate.Base: instance GHC.Base.Functor f => GHC.Base.Applicative (Data.Generics.Fixplate.Base.CoAttrib f)
+ Data.Generics.Fixplate.Base: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Generics.Fixplate.Base.Ann f a)
+ Data.Generics.Fixplate.Base: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Generics.Fixplate.Base.Attrib f)
+ Data.Generics.Fixplate.Base: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Generics.Fixplate.Base.CoAnn f a)
+ Data.Generics.Fixplate.Base: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Generics.Fixplate.Base.CoAttrib f)
+ Data.Generics.Fixplate.Base: instance GHC.Base.Functor f => GHC.Base.Monad (Data.Generics.Fixplate.Base.CoAttrib f)
+ Data.Generics.Fixplate.Base: instance GHC.Classes.Eq Data.Generics.Fixplate.Base.Hole
+ Data.Generics.Fixplate.Base: instance GHC.Classes.Ord Data.Generics.Fixplate.Base.Hole
+ Data.Generics.Fixplate.Draw: instance GHC.Show.Show Data.Generics.Fixplate.Draw.Void
+ Data.Generics.Fixplate.Functor: (:*:) :: (f a) -> (g a) -> (:*:) f g a
+ Data.Generics.Fixplate.Functor: InL :: (f a) -> (:+:) f g a
+ Data.Generics.Fixplate.Functor: InR :: (g a) -> (:+:) f g a
+ Data.Generics.Fixplate.Functor: data (:*:) f g a
+ Data.Generics.Fixplate.Functor: instance (Data.Foldable.Foldable f, Data.Foldable.Foldable g) => Data.Foldable.Foldable (f Data.Generics.Fixplate.Functor.:*: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Foldable.Foldable f, Data.Foldable.Foldable g) => Data.Foldable.Foldable (f Data.Generics.Fixplate.Functor.:+: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Generics.Fixplate.Base.EqF f, Data.Generics.Fixplate.Base.EqF g) => Data.Generics.Fixplate.Base.EqF (f Data.Generics.Fixplate.Functor.:*: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Generics.Fixplate.Base.EqF f, Data.Generics.Fixplate.Base.EqF g) => Data.Generics.Fixplate.Base.EqF (f Data.Generics.Fixplate.Functor.:+: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Generics.Fixplate.Base.OrdF f, Data.Generics.Fixplate.Base.OrdF g) => Data.Generics.Fixplate.Base.OrdF (f Data.Generics.Fixplate.Functor.:*: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Generics.Fixplate.Base.OrdF f, Data.Generics.Fixplate.Base.OrdF g) => Data.Generics.Fixplate.Base.OrdF (f Data.Generics.Fixplate.Functor.:+: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Generics.Fixplate.Base.ShowF f, Data.Generics.Fixplate.Base.ShowF g) => Data.Generics.Fixplate.Base.ShowF (f Data.Generics.Fixplate.Functor.:*: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Generics.Fixplate.Base.ShowF f, Data.Generics.Fixplate.Base.ShowF g) => Data.Generics.Fixplate.Base.ShowF (f Data.Generics.Fixplate.Functor.:+: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Traversable.Traversable f, Data.Traversable.Traversable g) => Data.Traversable.Traversable (f Data.Generics.Fixplate.Functor.:*: g)
+ Data.Generics.Fixplate.Functor: instance (Data.Traversable.Traversable f, Data.Traversable.Traversable g) => Data.Traversable.Traversable (f Data.Generics.Fixplate.Functor.:+: g)
+ Data.Generics.Fixplate.Functor: instance (GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (f Data.Generics.Fixplate.Functor.:*: g)
+ Data.Generics.Fixplate.Functor: instance (GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (f Data.Generics.Fixplate.Functor.:+: g)
+ Data.Generics.Fixplate.Functor: instance (GHC.Classes.Eq (f a), GHC.Classes.Eq (g a)) => GHC.Classes.Eq ((Data.Generics.Fixplate.Functor.:*:) f g a)
+ Data.Generics.Fixplate.Functor: instance (GHC.Classes.Eq (f a), GHC.Classes.Eq (g a)) => GHC.Classes.Eq ((Data.Generics.Fixplate.Functor.:+:) f g a)
+ Data.Generics.Fixplate.Functor: instance (GHC.Classes.Ord (f a), GHC.Classes.Ord (g a)) => GHC.Classes.Ord ((Data.Generics.Fixplate.Functor.:*:) f g a)
+ Data.Generics.Fixplate.Functor: instance (GHC.Classes.Ord (f a), GHC.Classes.Ord (g a)) => GHC.Classes.Ord ((Data.Generics.Fixplate.Functor.:+:) f g a)
+ Data.Generics.Fixplate.Functor: instance (GHC.Show.Show (f a), GHC.Show.Show (g a)) => GHC.Show.Show ((Data.Generics.Fixplate.Functor.:*:) f g a)
+ Data.Generics.Fixplate.Functor: instance (GHC.Show.Show (f a), GHC.Show.Show (g a)) => GHC.Show.Show ((Data.Generics.Fixplate.Functor.:+:) f g a)
+ Data.Generics.Fixplate.Hash: [_emptyHash] :: HashValue hash -> hash
+ Data.Generics.Fixplate.Hash: [_hashChar] :: HashValue hash -> Char -> hash -> hash
+ Data.Generics.Fixplate.Hash: [_hashHash] :: HashValue hash -> hash -> hash -> hash
+ Data.Generics.Fixplate.Hash: instance (Data.Generics.Fixplate.Base.ShowF f, GHC.Show.Show hash) => Data.Generics.Fixplate.Base.ShowF (Data.Generics.Fixplate.Hash.HashAnn hash f)
+ Data.Generics.Fixplate.Hash: instance (GHC.Classes.Eq hash, Data.Generics.Fixplate.Base.EqF f) => Data.Generics.Fixplate.Base.EqF (Data.Generics.Fixplate.Hash.HashAnn hash f)
+ Data.Generics.Fixplate.Hash: instance (GHC.Classes.Ord hash, Data.Generics.Fixplate.Base.OrdF f) => Data.Generics.Fixplate.Base.OrdF (Data.Generics.Fixplate.Hash.HashAnn hash f)
+ Data.Generics.Fixplate.Hash: instance (GHC.Show.Show hash, GHC.Show.Show (f a)) => GHC.Show.Show (Data.Generics.Fixplate.Hash.HashAnn hash f a)
+ Data.Generics.Fixplate.Hash: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Generics.Fixplate.Hash.HashAnn hash f)
+ Data.Generics.Fixplate.Hash: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Generics.Fixplate.Hash.HashAnn hash f)
+ Data.Generics.Fixplate.Hash: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Generics.Fixplate.Hash.HashAnn hash f)
+ Data.Generics.Fixplate.Hash: instance GHC.Show.Show Data.Generics.Fixplate.Hash.Void
+ Data.Generics.Fixplate.Open: instance (GHC.Base.Functor f, Data.Generics.Fixplate.Base.ShowF f) => GHC.Show.Show (Data.Generics.Fixplate.Open.Shape f)
+ Data.Generics.Fixplate.Open: instance Data.Generics.Fixplate.Base.EqF f => GHC.Classes.Eq (Data.Generics.Fixplate.Open.Shape f)
+ Data.Generics.Fixplate.Open: instance Data.Generics.Fixplate.Base.OrdF f => GHC.Classes.Ord (Data.Generics.Fixplate.Open.Shape f)
+ Data.Generics.Fixplate.Open: instance GHC.Show.Show Data.Generics.Fixplate.Open.Void
+ Data.Generics.Fixplate.Pretty: Algol :: !Bracket -> !Separator -> AppStyle
+ Data.Generics.Fixplate.Pretty: Application :: !AppStyle -> Fixity
+ Data.Generics.Fixplate.Pretty: Atom :: Fixity
+ Data.Generics.Fixplate.Pretty: Bracket :: !String -> !String -> Bracket
+ Data.Generics.Fixplate.Pretty: Custom :: !Int -> Fixity
+ Data.Generics.Fixplate.Pretty: Haskell :: AppStyle
+ Data.Generics.Fixplate.Pretty: Infix :: !Assoc -> !Int -> Fixity
+ Data.Generics.Fixplate.Pretty: Keyword :: String -> MixWord
+ Data.Generics.Fixplate.Pretty: LeftAssoc :: Assoc
+ Data.Generics.Fixplate.Pretty: Mixfix :: [MixWord] -> Fixity
+ Data.Generics.Fixplate.Pretty: NoAssoc :: Assoc
+ Data.Generics.Fixplate.Pretty: Placeholder :: MixWord
+ Data.Generics.Fixplate.Pretty: Postfix :: !Int -> Fixity
+ Data.Generics.Fixplate.Pretty: Prefix :: !Int -> Fixity
+ Data.Generics.Fixplate.Pretty: RightAssoc :: Assoc
+ Data.Generics.Fixplate.Pretty: class (Functor f, Foldable f) => Pretty f where showsPrecNode child d node = showParen (d > prec) $ case fty of { Atom -> showString (showNode node) Application style -> case style of { Haskell -> head . args where head = showString (showNode node) args = foldr (.) id [showChar ' ' . child (prec + 1) c | c <- children] Algol (Bracket open close) sep -> head . showString open . args . showString close where head = showString (showNode node) args = foldr (.) id $ intersperse (showString sep) [child 0 c | c <- children] } Prefix prec -> case children of { [] -> error "showsPrecNode: prefix node with no arguments" (c : cs) -> op . arg1 c . args cs } where op = showString (showNode node) arg1 c = child (prec + 1) c args cs = foldr (.) id [showChar ' ' . child (prec + 1) c | c <- cs] Postfix prec -> case children of { [] -> error "showsPrecNode: postfix node with no arguments" ccs -> let (cs, c) = (init ccs, last ccs) in args cs . arg1 c . op } where op = showString (showNode node) arg1 c = child (prec + 1) c args cs = foldr (.) id [child (prec + 1) c . showChar ' ' | c <- cs] Infix assoc prec -> case children of { [] -> error "showsPrecNode: infix node with no arguments" [_] -> error "showsPrecNode: infix node with a single argument" (c1 : c2 : cs) -> lhs c1 . op . rhs c2 . rest cs } where lhs c1 = child lprec c1 op = showString (showNode node) rhs c2 = child rprec c2 rest cs = foldr (.) id [showChar ' ' . child (prec + 1) c | c <- cs] lprec = case assoc of { LeftAssoc -> prec _ -> prec + 1 } rprec = case assoc of { RightAssoc -> prec _ -> prec + 1 } Mixfix mwords -> mixWords mwords [child (prec + 1) c | c <- children] Custom prec -> error "for custom rendering, you should redefine `showsPrecNode'" } where fty = fixity node prec = fixityPrecedence fty children = toList node
+ Data.Generics.Fixplate.Pretty: data AppStyle
+ Data.Generics.Fixplate.Pretty: data Assoc
+ Data.Generics.Fixplate.Pretty: data Bracket
+ Data.Generics.Fixplate.Pretty: data Fixity
+ Data.Generics.Fixplate.Pretty: data MixWord
+ Data.Generics.Fixplate.Pretty: fixity :: Pretty f => f a -> Fixity
+ Data.Generics.Fixplate.Pretty: fixityPrecedence :: Fixity -> Int
+ Data.Generics.Fixplate.Pretty: instance GHC.Classes.Eq Data.Generics.Fixplate.Pretty.AppStyle
+ Data.Generics.Fixplate.Pretty: instance GHC.Classes.Eq Data.Generics.Fixplate.Pretty.Assoc
+ Data.Generics.Fixplate.Pretty: instance GHC.Classes.Eq Data.Generics.Fixplate.Pretty.Bracket
+ Data.Generics.Fixplate.Pretty: instance GHC.Classes.Eq Data.Generics.Fixplate.Pretty.Fixity
+ Data.Generics.Fixplate.Pretty: instance GHC.Classes.Eq Data.Generics.Fixplate.Pretty.MixWord
+ Data.Generics.Fixplate.Pretty: instance GHC.Show.Show Data.Generics.Fixplate.Pretty.AppStyle
+ Data.Generics.Fixplate.Pretty: instance GHC.Show.Show Data.Generics.Fixplate.Pretty.Assoc
+ Data.Generics.Fixplate.Pretty: instance GHC.Show.Show Data.Generics.Fixplate.Pretty.Bracket
+ Data.Generics.Fixplate.Pretty: instance GHC.Show.Show Data.Generics.Fixplate.Pretty.Fixity
+ Data.Generics.Fixplate.Pretty: instance GHC.Show.Show Data.Generics.Fixplate.Pretty.MixWord
+ Data.Generics.Fixplate.Pretty: mixWords :: [MixWord] -> [ShowS] -> ShowS
+ Data.Generics.Fixplate.Pretty: pretty :: Pretty f => Mu f -> String
+ Data.Generics.Fixplate.Pretty: prettyPrec :: Pretty f => Int -> Mu f -> ShowS
+ Data.Generics.Fixplate.Pretty: prettyS :: Pretty f => Mu f -> ShowS
+ Data.Generics.Fixplate.Pretty: showNode :: Pretty f => f a -> String
+ Data.Generics.Fixplate.Pretty: showsPrecNode :: Pretty f => (Int -> a -> ShowS) -> Int -> f a -> ShowS
+ Data.Generics.Fixplate.Pretty: type Separator = String
+ Data.Generics.Fixplate.Trie: christmasTree :: (Functor f, Foldable f, OrdF f) => Mu f -> Attr f (Trie f Int)
+ Data.Generics.Fixplate.Trie: instance Data.Generics.Fixplate.Base.EqF f => GHC.Classes.Eq (Data.Generics.Fixplate.Trie.HoleF f)
+ Data.Generics.Fixplate.Trie: instance Data.Generics.Fixplate.Base.OrdF f => GHC.Classes.Ord (Data.Generics.Fixplate.Trie.HoleF f)
+ Data.Generics.Fixplate.Util.Hash.Class: instance (Data.Generics.Fixplate.Util.Hash.Class.Hashable a, Data.Generics.Fixplate.Util.Hash.Class.Hashable b) => Data.Generics.Fixplate.Util.Hash.Class.Hashable (a, b)
+ Data.Generics.Fixplate.Util.Hash.Class: instance (Data.Generics.Fixplate.Util.Hash.Class.Hashable a, Data.Generics.Fixplate.Util.Hash.Class.Hashable b, Data.Generics.Fixplate.Util.Hash.Class.Hashable c) => Data.Generics.Fixplate.Util.Hash.Class.Hashable (a, b, c)
+ Data.Generics.Fixplate.Util.Hash.Class: instance (Data.Generics.Fixplate.Util.Hash.Class.Hashable a, Data.Generics.Fixplate.Util.Hash.Class.Hashable b, Data.Generics.Fixplate.Util.Hash.Class.Hashable c, Data.Generics.Fixplate.Util.Hash.Class.Hashable d) => Data.Generics.Fixplate.Util.Hash.Class.Hashable (a, b, c, d)
+ Data.Generics.Fixplate.Util.Hash.Class: instance (Data.Generics.Fixplate.Util.Hash.Class.Hashable a, Data.Generics.Fixplate.Util.Hash.Class.Hashable b, Data.Generics.Fixplate.Util.Hash.Class.Hashable c, Data.Generics.Fixplate.Util.Hash.Class.Hashable d, Data.Generics.Fixplate.Util.Hash.Class.Hashable e) => Data.Generics.Fixplate.Util.Hash.Class.Hashable (a, b, c, d, e)
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Types.Bool
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Types.Char
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Types.Int
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Types.Word
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Word.Word16
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Word.Word32
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Word.Word64
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable GHC.Word.Word8
+ Data.Generics.Fixplate.Util.Hash.Class: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable a => Data.Generics.Fixplate.Util.Hash.Class.Hashable [a]
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance Data.Generics.Fixplate.Util.Hash.Class.HashValue Data.Generics.Fixplate.Util.Hash.FNV.FNV32.FNV32
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable Data.Generics.Fixplate.Util.Hash.FNV.FNV32.FNV32
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance GHC.Classes.Eq Data.Generics.Fixplate.Util.Hash.FNV.FNV32.FNV32
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance GHC.Classes.Ord Data.Generics.Fixplate.Util.Hash.FNV.FNV32.FNV32
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV32: instance GHC.Show.Show Data.Generics.Fixplate.Util.Hash.FNV.FNV32.FNV32
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance Data.Generics.Fixplate.Util.Hash.Class.HashValue Data.Generics.Fixplate.Util.Hash.FNV.FNV64.FNV64
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance Data.Generics.Fixplate.Util.Hash.Class.Hashable Data.Generics.Fixplate.Util.Hash.FNV.FNV64.FNV64
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance GHC.Classes.Eq Data.Generics.Fixplate.Util.Hash.FNV.FNV64.FNV64
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance GHC.Classes.Ord Data.Generics.Fixplate.Util.Hash.FNV.FNV64.FNV64
+ Data.Generics.Fixplate.Util.Hash.FNV.FNV64: instance GHC.Show.Show Data.Generics.Fixplate.Util.Hash.FNV.FNV64.FNV64
+ Data.Generics.Fixplate.Zipper: [focus] :: Loc f -> Mu f
+ Data.Generics.Fixplate.Zipper: [path] :: Loc f -> Path f
+ Data.Generics.Fixplate.Zipper: [unPath] :: Path f -> f (Node f)
+ Data.Generics.Fixplate.Zipper: instance Data.Generics.Fixplate.Base.EqF f => GHC.Classes.Eq (Data.Generics.Fixplate.Zipper.Loc f)
+ Data.Generics.Fixplate.Zipper: instance Data.Generics.Fixplate.Base.EqF f => GHC.Classes.Eq (Data.Generics.Fixplate.Zipper.Path f)
+ Data.Generics.Fixplate.Zipper: instance Data.Generics.Fixplate.Base.ReadF f => GHC.Read.Read (Data.Generics.Fixplate.Zipper.Loc f)
+ Data.Generics.Fixplate.Zipper: instance Data.Generics.Fixplate.Base.ReadF f => GHC.Read.Read (Data.Generics.Fixplate.Zipper.Path f)
+ Data.Generics.Fixplate.Zipper: instance Data.Generics.Fixplate.Base.ShowF f => GHC.Show.Show (Data.Generics.Fixplate.Zipper.Loc f)
+ Data.Generics.Fixplate.Zipper: instance Data.Generics.Fixplate.Base.ShowF f => GHC.Show.Show (Data.Generics.Fixplate.Zipper.Path f)
+ Data.Generics.Fixplate.Zipper: unsafeMoveLeft :: Traversable f => Loc f -> Loc f
+ Data.Generics.Fixplate.Zipper: unsafeMoveRight :: Traversable f => Loc f -> Loc f
- Data.Generics.Fixplate: foldl :: Foldable t => (a -> b -> a) -> a -> t b -> a
+ Data.Generics.Fixplate: foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
- Data.Generics.Fixplate.Draw: graphvizTreeWith :: Traversable f => (f Hole -> String) -> Mu f -> String
+ Data.Generics.Fixplate.Draw: graphvizTreeWith :: (Traversable f) => (f Hole -> String) -> Mu f -> String
- Data.Generics.Fixplate.Open: toList :: Foldable t => t a -> [a]
+ Data.Generics.Fixplate.Open: toList :: Foldable t => forall a. t a -> [a]
- Data.Generics.Fixplate.Util.Hash.Table: Bucket :: {-# UNPACK #-} !Int -> !Map k (Leaf v) -> Bucket k v
+ Data.Generics.Fixplate.Util.Hash.Table: Bucket :: {-# UNPACK #-} !Int -> !(Map k (Leaf v)) -> Bucket k v

Files

Data/Generics/Fixplate.hs view
@@ -48,6 +48,8 @@ --
 -- * "Data.Generics.Fixplate.Base" - core types and type classes
 --
+-- * "Data.Generics.Fixplate.Functor" - sum and product functors
+--
 -- * "Data.Generics.Fixplate.Traversals" - Uniplate-style traversals
 --
 -- * "Data.Generics.Fixplate.Morphisms" - recursion schemes
@@ -60,6 +62,8 @@ --
 -- * "Data.Generics.Fixplate.Draw" - generic tree drawing (both ASCII and graphviz)
 -- 
+-- * "Data.Generics.Fixplate.Pretty" - pretty-printing of expression trees
+--
 -- * "Data.Generics.Fixplate.Trie" - generic generalized tries
 --
 -- * "Data.Generics.Fixplate.Hash" - annotating trees with their hashes
@@ -67,8 +71,10 @@ -- This module re-exports the most common functionality present in the library
 -- (but not for example the zipper, tries, hashing).
 -- 
---
 -- The library itself should be fully Haskell98 compatible; no language extensions are used.
+-- The only exception is the "Data.Generics.Fixplate.Functor" module, which uses the TypeOperators
+-- language extension for syntactic convenience (but this is not used anywhere else).
+--
 -- Note: to obtain 'Eq', 'Ord', 'Show', 'Read' and other instances for 
 -- fixed point types like @Mu Expr1@, consult the documentation of the
 -- 'EqF' type class (cf. the related 'OrdF', 'ShowF' and 'ReadF' classes)
Data/Generics/Fixplate/Attributes.hs view
@@ -1,5 +1,8 @@ 
 -- | Synthetising attributes, partly motivated by Attribute Grammars, and partly by recursion schemes.
+--
+-- TODO: better organization \/ interface to all these functions...
+--
 
 {-# LANGUAGE CPP #-}
 module Data.Generics.Fixplate.Attributes
@@ -448,7 +451,7 @@   h tree@(Fix (TreeF label ts)) ys = unLabel label++"_"++show siz++"(" ++ intercalate "," (zipWith c (toList ys) sizs) ++ ")" where
     siz = cata f tree
     sizs = map (cata f) ts
-    f t = 1 + Data.Foldable.sum t
+    f t = (1::Int) + Data.Foldable.sum t
     c str j = str ++ "<" ++ show j ++ ">"
 
 prop_synthPara :: FixT Label -> Bool
@@ -456,7 +459,7 @@   g :: TreeF Label (FixT Label , String) -> String
   g (TreeF (Label label) xs) = label++"(" ++ intercalate "," (map u xs) ++ ")" where
     u (tree,a) = show siz ++ "_" ++ a where
-      siz = cata (\t -> 1 + Data.Foldable.sum t) tree
+      siz = cata (\t -> (1::Int) + Data.Foldable.sum t) tree
 
 scanCataNaive :: Functor f => (a -> f b -> b) -> Attr f a -> Attr f b
 scanCataNaive f = annZipWith (flip const) . synthCata (\(Ann a x) -> f a x)
Data/Generics/Fixplate/Base.hs view
@@ -7,10 +7,10 @@ --------------------------------------------------------------------------------
 
 import Control.Applicative
-import Control.Monad (liftM)
+import Control.Monad ( liftM , ap)
 import Data.Foldable
 import Data.Traversable
-import Prelude hiding (foldl,foldr,mapM,mapM_,concat,concatMap)
+import Prelude hiding ( foldl , foldr , mapM , mapM_ , concat , concatMap)
 
 import Text.Show
 import Text.Read
@@ -309,9 +309,14 @@     go (Fix (CoAnn t)) = Fix <$> (CoAnn <$> traverse go t)
     go (Fix (Pure  x)) = Fix <$> (Pure  <$> h x)
 
+instance Functor f => Applicative (CoAttrib f) where
+  pure x = CoAttrib (Fix (Pure x))
+  (<*>)  = ap
+
 instance Functor f => Monad (CoAttrib f) where
   return x = CoAttrib (Fix (Pure x))
   CoAttrib (Fix (CoAnn t))  >>=  u  =  CoAttrib (Fix (CoAnn (fmap (unCoAttrib . (>>=u) . CoAttrib) t)))
   CoAttrib (Fix (Pure  x))  >>=  u  =  u x
+
 
 --------------------------------------------------------------------------------
+ Data/Generics/Fixplate/Functor.hs view
@@ -0,0 +1,117 @@+
+-- | Sum and product functors, with the usual instances. 
+-- You can in principle use these to extend existing expressions, for example
+--
+-- > type ExtendedExpression = Mu (Expr :+: Custom)
+--
+-- This module uses the TypeOperators language extension for convenience.
+--
+
+{-# LANGUAGE TypeOperators #-}
+module Data.Generics.Fixplate.Functor 
+  ( (:+:) (..) 
+  , (:*:) (..)
+  )
+  where
+
+--------------------------------------------------------------------------------
+
+import Prelude hiding ( foldl , foldr , mapM )
+import Control.Applicative ( (<$>) , (<*>) )
+import Control.Monad ( liftM )
+
+import Data.Generics.Fixplate
+
+--------------------------------------------------------------------------------
+
+-- | Sum of two functors
+data (f :+: g) a = InL (f a) | InR (g a) deriving (Eq,Ord,Show)
+
+-- | Product of two functors
+data (f :*: g) a = (f a) :*: (g a)       deriving (Eq,Ord,Show)
+
+infixl 6 :+:
+infixl 7 :*:
+
+--------------------------------------------------------------------------------
+
+instance (Functor f, Functor g) => Functor (f :+: g) where
+  fmap h (InL x) = InL (fmap h x)
+  fmap h (InR y) = InR (fmap h y)
+
+instance (Foldable f, Foldable g) => Foldable (f :+: g) where
+  foldl h a (InL x) = foldl h a x
+  foldl h a (InR y) = foldl h a y
+
+  foldr h a (InL x) = foldr h a x 
+  foldr h a (InR y) = foldr h a y 
+
+instance (Traversable f, Traversable g) => Traversable (f :+: g) where
+  traverse h (InL x) = InL <$> traverse h x
+  traverse h (InR y) = InR <$> traverse h y
+
+  mapM h (InL x) = liftM InL $ mapM h x
+  mapM h (InR y) = liftM InR $ mapM h y
+
+--------------------------------------------------------------------------------
+
+instance (Functor f, Functor g) => Functor (f :*: g) where
+  fmap h (x :*: y) = fmap h x :*: fmap h y
+
+instance (Foldable f, Foldable g) => Foldable (f :*: g) where
+  foldl h a (x :*: y) = let a' = foldl h a x in foldl h a' y
+  foldr h a (x :*: y) = let a' = foldr h a y in foldr h a' x
+
+instance (Traversable f, Traversable g) => Traversable (f :*: g) where
+  traverse h (x :*: y) = (:*:) <$> traverse h x <*> traverse h y
+  mapM h (x :*: y) = do 
+    x1 <- mapM h x
+    y1 <- mapM h y
+    return (x1 :*: y1)
+
+--------------------------------------------------------------------------------
+
+app_prec , mul_prec :: Int
+app_prec = 10 
+mul_prec = 7 
+
+--------------------------------------------------------------------------------
+
+instance (EqF f, EqF g) => EqF (f :+: g) where 
+  equalF (InL x) (InL y) = equalF x y
+  equalF (InR x) (InR y) = equalF x y
+  equalF _       _       = False
+
+instance (OrdF f, OrdF g) => OrdF (f :+: g) where
+  compareF (InL x) (InL y) = compareF x y
+  compareF (InR x) (InR y) = compareF x y
+  compareF (InL _) (InR _) = LT
+  compareF (InR _) (InL _) = GT
+
+instance (ShowF f, ShowF g) => ShowF (f :+: g) where 
+  showsPrecF d (InL x) = showParen (d>app_prec) 
+    $ showString "InL " 
+    . showsPrecF (app_prec+1) x
+  showsPrecF d (InR x) = showParen (d>app_prec) 
+    $ showString "InR " 
+    . showsPrecF (app_prec+1) x
+
+--------------------------------------------------------------------------------
+
+instance (EqF f, EqF g) => EqF (f :*: g) where 
+  equalF (x1 :*: x2) (y1 :*: y2) = equalF x1 y1 && equalF x2 y2
+
+instance (OrdF f, OrdF g) => OrdF (f :*: g) where
+  compareF (x1 :*: x2) (y1 :*: y2) = case compareF x1 y1 of 
+    LT -> LT
+    GT -> GT
+    EQ -> compareF  x2 y2 
+
+instance (ShowF f, ShowF g) => ShowF (f :*: g) where 
+  showsPrecF d (x :*: y) = showParen (d>mul_prec) 
+    $ showsPrecF (mul_prec+1) x
+    . showString " :*: " 
+    . showsPrecF (mul_prec+1) y
+
+--------------------------------------------------------------------------------
+
Data/Generics/Fixplate/Hash.hs view
@@ -31,7 +31,7 @@ import Data.Foldable    as F
 import Data.Traversable as T
 
-import Text.Show
+import Text.Show ()
 
 --------------------------------------------------------------------------------
 
Data/Generics/Fixplate/Misc.hs view
@@ -4,14 +4,16 @@ 
 --------------------------------------------------------------------------------
 
-import Prelude hiding (mapM,mapM_)
+import Prelude hiding ( mapM , mapM_ )
 
 import Data.List ( sortBy , groupBy )
 import Data.Ord
 
 import Data.Traversable
 
---import Control.Monad (liftM)
+import Control.Applicative ( Applicative(..) )
+import Control.Monad ( ap , liftM )
+
 --import Control.Monad.Trans.State
 
 --------------------------------------------------------------------------------
@@ -96,29 +98,42 @@   return ()
 
 mapAccumM :: (Traversable t, Monad m) => (a -> b -> m (a, c)) -> a -> t b -> m (a, t c)
-mapAccumM act x0 t = runStateT (mapM (StateT . flip act) t) x0 where
+mapAccumM user x0 t = liftM swap $ runStateT (mapM action t) x0 where
+  action x = StateT $ \acc -> do
+    (acc', y) <- user acc x 
+    return (y, acc') 
 
+swap :: (a,b) -> (b,a)
+swap (x,y) = (y,x)
+
 --------------------------------------------------------------------------------  
 
-newtype StateT s m a = StateT { runStateT :: s -> m (s,a) }
+newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
 
+instance (Functor m) => Functor (StateT s m) where
+  fmap f m = StateT $ \s -> fmap (\ ~(a, s') -> (f a, s')) $ runStateT m s
+
+instance (Functor m, Monad m) => Applicative (StateT s m) where
+  pure  = return
+  (<*>) = ap
+
 instance (Monad m) => Monad (StateT s m) where
-  return a = state $ \s -> (s,a)
+  return a = state $ \s -> (a, s)
   m >>= k  = StateT $ \s -> do
-    ~(s', a) <- runStateT m s
+    ~(a, s') <- runStateT m s
     runStateT (k a) s'
   fail str = StateT $ \_ -> fail str
 
-state :: Monad m => (s -> (s,a)) -> StateT s m a 
+state :: (Monad m) => (s -> (a,s)) -> StateT s m a 
 state f = StateT (return . f)
 
 sget :: (Monad m) => StateT s m s
 sget = state $ \s -> (s,s)
 
 sput :: (Monad m) => s -> StateT s m ()
-sput s = state $ \_ -> (s,())
+sput s = state $ \_ -> ((),s)
 
 smodify :: (Monad m) => (s -> s) -> StateT s m ()
-smodify f = state $ \s -> (f s,())
+smodify f = state $ \s -> ((), f s)
 
 --------------------------------------------------------------------------------  
+ Data/Generics/Fixplate/Pretty.hs view
@@ -0,0 +1,172 @@+
+-- | Generic pretty-printing of expression trees.
+--
+-- TODO: 
+--
+--  * make the style configurable (so that we can print the same expression in different formats)
+--    (in Haskell98, we have to use the record instead of class trick for this?)
+--
+--  * corresponding parser?
+--
+
+module Data.Generics.Fixplate.Pretty where
+
+--------------------------------------------------------------------------------
+
+import Prelude
+import Data.List ( intersperse )
+
+import Data.Generics.Fixplate
+import Data.Foldable ( toList )
+
+import Text.Show ()
+
+--------------------------------------------------------------------------------
+
+-- | Associativity
+data Assoc 
+  = NoAssoc 
+  | LeftAssoc 
+  | RightAssoc
+  deriving (Eq,Show)
+
+-- | A pair of matching brackets, eg. @Bracket \"(\" \")\"@ or @Bracket \"[|\" \"|]\"@.
+data Bracket = Bracket !String !String deriving (Eq,Show)
+
+-- | A separator, eg. @\",\"@ or @\" | \"@.
+type Separator = String
+
+-- | Application style 
+data AppStyle
+  = Haskell                    -- ^ eg. @(Node arg1 arg2 arg3)@; precedence will be @app_prec == 10@
+  | Algol !Bracket !Separator  -- ^ eg. @node[arg1,arg2,arg3]@; precedence will be 11, but child environment precedence will be 0
+  deriving (Eq,Show)
+
+-- | Mixfix style. Example: 
+--
+-- > [ Keyword "if" , Placeholder , keyword "then" , Placeholder , keyword "else" , Placeholder ]
+--
+data MixWord 
+  = Keyword String
+  | Placeholder
+  deriving (Eq,Show)
+
+mixWords :: [MixWord] -> [ShowS] -> ShowS
+mixWords mws args = Prelude.foldr (.) id (intersperse (showChar ' ') (go mws args)) where 
+  go :: [MixWord] -> [ShowS] -> [ShowS]
+  go (Keyword s   : rest) fs     = showString s : go rest fs
+  go (Placeholder : rest) (f:fs) = f : go rest fs
+  go (Placeholder : rest) [] = error "mixWords: not enough arguments"
+  go [] []     = []
+  go [] (f:fs) = f : go [] fs
+
+-- | Fixities. TODO: separate non-fixity stuff like style and words
+data Fixity 
+  = Atom                   -- ^ eg. @variable@; precedence will be 666
+  | Application !AppStyle  -- ^ eg. @(Node arg1 arg2 arg3)@ or @node[arg1,arg2,arg3]@.
+  | Prefix  !Int           -- ^ eg. @~arg@; the @Int@ is the precendence
+  | Infix !Assoc !Int      -- ^ eg. @x+y@
+  | Postfix !Int           -- ^ eg. @arg++@
+  | Mixfix [MixWord]       -- ^ eg. @if ... then ... else ... @ or @let ... in ...@. With precedence 0?
+  | Custom  !Int           -- ^ for your custom rendering
+  deriving (Eq,Show)
+
+fixityPrecedence :: Fixity -> Int
+fixityPrecedence f = case f of
+  Atom              -> 666
+  Application style -> 
+    case style of
+      Haskell  -> 10
+      Algol {} -> 11
+  Prefix prec       -> prec
+  Infix assoc prec  -> prec
+  Postfix prec      -> prec
+  Mixfix {}         -> 0
+  Custom prec       -> prec
+
+--------------------------------------------------------------------------------
+
+-- | A class encoding fixity and rendering of nodes if the tree.
+--
+-- Minimum complete definition: 'fixity', and 'showNode' or 'showsPrecNode'.
+-- Unless you want some type of rendering not directly supported, you shouldn't specify 'showsPrecNode'.
+--
+class (Functor f, Foldable f) => Pretty f where
+  -- | fixity of the node
+  fixity    :: f a -> Fixity                                      
+
+  -- | a string representing the node /without/ the children
+  showNode  :: f a -> String                                      
+
+  -- | full rendering of the node. You can redefine this for custom renderings.
+  showsPrecNode :: (Int -> a -> ShowS) -> Int -> f a -> ShowS     
+  showsPrecNode child d node = showParen (d > prec) $ 
+    case fty of       
+      Atom -> showString (showNode node)
+
+      Application style -> case style of
+
+        Haskell -> head . args where
+          head = showString (showNode node)
+          args = Prelude.foldr (.) id [ showChar ' ' . child (prec+1) c | c <- children ]
+
+        Algol (Bracket open close) sep -> head . showString open . args . showString close where
+          head = showString (showNode node)
+          args = Prelude.foldr (.) id 
+               $ intersperse (showString sep) [ child 0 c | c <- children ]
+
+      Prefix prec -> 
+        case children of
+          [] -> error "showsPrecNode: prefix node with no arguments"
+          (c:cs) -> op . arg1 c . args cs
+        where
+          op = showString (showNode node)
+          arg1 c  = child (prec+1) c 
+          args cs = Prelude.foldr (.) id [ showChar ' ' . child (prec+1) c | c <- cs ]
+
+      Postfix prec -> 
+        case children of
+          []  -> error "showsPrecNode: postfix node with no arguments"
+          ccs -> let (cs,c) = (Prelude.init ccs, Prelude.last ccs) 
+                 in  args cs . arg1 c . op
+        where
+          op = showString (showNode node)
+          arg1 c  = child (prec+1) c 
+          args cs = Prelude.foldr (.) id [ child (prec+1) c . showChar ' ' | c <- cs ]
+
+      Infix assoc prec -> 
+        case children of
+          []  -> error "showsPrecNode: infix node with no arguments"
+          [_] -> error "showsPrecNode: infix node with a single argument"
+          (c1:c2:cs) -> lhs c1 . op . rhs c2 . rest cs
+        where
+          lhs  c1 = child lprec c1 
+          op      = showString (showNode node) 
+          rhs  c2 = child rprec c2
+          rest cs = Prelude.foldr (.) id [ showChar ' ' . child (prec+1) c | c <- cs ]
+          lprec = case assoc of { LeftAssoc  -> prec ; _ -> prec+1 }
+          rprec = case assoc of { RightAssoc -> prec ; _ -> prec+1 }
+        
+      Mixfix mwords -> mixWords mwords [ child (prec+1) {- ? -} c | c <- children ]
+
+      Custom prec -> error "for custom rendering, you should redefine `showsPrecNode'"
+
+    where
+      fty  = fixity node
+      prec = fixityPrecedence fty
+      children = toList node
+
+--------------------------------------------------------------------------------
+
+-- | Render the expression
+pretty :: Pretty f => Mu f -> String 
+pretty tree = prettyS tree "" 
+
+prettyS :: Pretty f => Mu f -> ShowS
+prettyS = prettyPrec 0 
+
+prettyPrec :: Pretty f => Int -> Mu f -> ShowS
+prettyPrec d t = go d t where
+  go d (Fix t) = showsPrecNode go d t
+
+--------------------------------------------------------------------------------
Data/Generics/Fixplate/Trie.hs view
@@ -17,7 +17,9 @@     -- * Construction \/ deconstruction
   , empty , singleton
   , fromList , toList
+    -- * Multisets
   , bag , universeBag
+  , christmasTree
     -- * Lookup
   , lookup 
     -- * Insertion \/ deletion
@@ -53,6 +55,7 @@ import Test.QuickCheck
 import Data.Generics.Fixplate.Test.Tools
 import Data.Generics.Fixplate.Misc
+import Data.Generics.Fixplate.Traversals
 import Data.List ( sort , group , nubBy , nub , (\\) , foldl' )
 import Control.Applicative ( (<$>) )
 import Debug.Trace
@@ -69,10 +72,19 @@ --
 -- > universeBag == bag . universe
 --
--- TODO: more efficient implementation?
+-- TODO: more efficient implementation? and better name
 universeBag :: (Functor f, Foldable f, OrdF f) => Mu f -> Trie f Int
 universeBag = bag . universe
 
+-- | We attribute each node with the multiset of all its subtrees.
+-- TODO: better name
+christmasTree :: (Functor f, Foldable f, OrdF f) => Mu f -> Attr f (Trie f Int)
+christmasTree = go where
+  go this@(Fix t) = Fix (Ann (ins us) sub) where
+    sub = fmap go t
+    us  = Foldable.foldl (trieUnionWith (+)) emptyTrie (fmap attribute sub)   
+    ins = trieInsertWith id (+) this 1
+
 ---------------------------------------------------------------------------------
 
 empty :: (Functor f, Foldable f, OrdF f) => Trie f a 
@@ -284,6 +296,11 @@   quickCheck prop_intersection
 
   quickCheck prop_unibag_naive
+  quickCheck prop_unibag_naive_2
+  quickCheck prop_christmasTree
+  quickCheck prop_christmasTree_2
+  quickCheck prop_christmasTree_3
+
   quickCheck prop_fromList_naive
   quickCheck prop_bag
   quickCheck prop_bag_b
@@ -351,6 +368,9 @@ prop_unibag_naive :: FixT Label -> Bool
 prop_unibag_naive tree = toList (universeBag tree) == toList (universeBagNaive tree)
 
+prop_unibag_naive_2 :: FixT Bool -> Bool
+prop_unibag_naive_2 tree = toList (universeBag tree) == toList (universeBagNaive tree)
+
 prop_fromList_naive :: FiniteMap -> Bool
 prop_fromList_naive (FiniteMap list) = toList (fromList list) == toList (fromListNaive list)
 
@@ -471,6 +491,21 @@ 
   dtrie = sort $     toList $     differenceWith f (   bag xs) (   bag ys)
   dmap  = sort $ Map.toList $ Map.differenceWith f (mapBag xs) (mapBag ys) 
+
+prop_christmasTree :: FixT Label -> Bool
+prop_christmasTree tree = toList (attribute (christmasTree tree)) == toList (universeBag tree)
+
+prop_christmasTree_3 :: FixT Bool -> Bool
+prop_christmasTree_3 tree = toList (attribute (christmasTree tree)) == toList (universeBag tree)
+
+-- we reduce the labels so that there is more chance for collisions
+prop_christmasTree_2 :: Bool -> FixT Label -> Bool
+prop_christmasTree_2 b tree0 = toList (attribute (christmasTree tree)) == toList (universeBag tree) where
+  tree = transform f tree0
+  f = if b 
+    then \(Fix (TreeF (Label label) ts)) -> Fix $ TreeF (Label (take 1 label)) ts
+    else \(Fix (TreeF (Label label) ts)) -> Fix $ TreeF (Label ""            ) ts
+
 
 #endif
 
Data/Generics/Fixplate/Util/Hash/Class.hs view
@@ -6,9 +6,9 @@ 
 import Data.Char
 import Data.Word
-import Data.Int
 import Data.Bits
 import Data.List
+-- import Data.Int
 
 --------------------------------------------------------------------------------
 
Data/Generics/Fixplate/Zipper.hs view
@@ -1,5 +1,5 @@ 
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, FlexibleInstances #-}
 
 -- | The Zipper is a data structure which maintains a location in 
 -- a tree, and allows O(1) movement and local changes
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2011-2012, Balazs Komuves+Copyright (c) 2011-2015, Balazs Komuves All rights reserved.  Redistribution and use in source and binary forms, with or without
fixplate.cabal view
@@ -1,21 +1,22 @@  Name:                fixplate-Version:             0.1.5+Version:             0.1.6 Synopsis:            Uniplate-style generic traversals for optionally annotated fixed-point types. Description:         Uniplate-style generic traversals for fixed-point types, which can be                        optionally annotated with attributes. We also provide recursion schemes,-                     and a generic zipper. See the module "Data.Generics.Fixplate" and then -                     the individual modules for more detailed information.+                     a generic zipper, generic pretty-printer, generic tries, generic hashing,+                     and generic tree visualization. See the module "Data.Generics.Fixplate" and +                     then the individual modules for more detailed information. License:             BSD3 License-file:        LICENSE Author:              Balazs Komuves-Copyright:           (c) 2011-2012 Balazs Komuves+Copyright:           (c) 2011-2015 Balazs Komuves Maintainer:          bkomuves (plus) hackage (at) gmail (dot) com Homepage:            http://code.haskell.org/~bkomuves/ Stability:           Experimental Category:            Generics-Tested-With:         GHC == 7.0.3-Cabal-Version:       >= 1.6+Tested-With:         GHC == 7.10.2+Cabal-Version:       >= 1.10 Build-Type:          Simple  source-repository head@@ -30,17 +31,9 @@   Description: Include utility modules   default: True -Flag base4-  Description: Base v4-   Library -  if flag(base4)-    Build-Depends:       base >= 4 && < 5-    cpp-options:         -DBASE_VERSION=4-  else -    Build-Depends:       base >= 3 && < 4-    cpp-options:         -DBASE_VERSION=3+  Build-Depends:       base >= 4 && < 5    if flag(withUtils)     Build-Depends:       containers@@ -52,12 +45,14 @@    Exposed-Modules:     Data.Generics.Fixplate                        Data.Generics.Fixplate.Base+                       Data.Generics.Fixplate.Functor                        Data.Generics.Fixplate.Open                        Data.Generics.Fixplate.Traversals                        Data.Generics.Fixplate.Morphisms                        Data.Generics.Fixplate.Attributes                        Data.Generics.Fixplate.Zipper                        Data.Generics.Fixplate.Draw+                       Data.Generics.Fixplate.Pretty                        Data.Generics.Fixplate.Trie                        Data.Generics.Fixplate.Hash @@ -74,14 +69,18 @@     Exposed-Modules:     Data.Generics.Fixplate.Test.Tools                          Data.Generics.Fixplate.Test.Instances                          Data.Generics.Fixplate.Tests-    Extensions:          TypeSynonymInstances++    other-extensions:    TypeSynonymInstances  -  Extensions:          CPP+  default-extensions:  CPP+  other-extensions:    TypeOperators    if impl(ghc)-    Extensions:          BangPatterns+    default-extensions:  BangPatterns    Hs-Source-Dirs:      .++  Default-Language:    Haskell2010    ghc-options:         -Wall -fno-warn-unused-matches -fno-warn-name-shadowing