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 +7/−1
- Data/Generics/Fixplate/Attributes.hs +5/−2
- Data/Generics/Fixplate/Base.hs +7/−2
- Data/Generics/Fixplate/Functor.hs +117/−0
- Data/Generics/Fixplate/Hash.hs +1/−1
- Data/Generics/Fixplate/Misc.hs +24/−9
- Data/Generics/Fixplate/Pretty.hs +172/−0
- Data/Generics/Fixplate/Trie.hs +36/−1
- Data/Generics/Fixplate/Util/Hash/Class.hs +1/−1
- Data/Generics/Fixplate/Zipper.hs +1/−1
- LICENSE +1/−1
- fixplate.cabal +17/−18
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