1{-# LANGUAGE CPP, MultiParamTypeClasses, DeriveGeneric, DeriveDataTypeable #-} 2module Plates where 3 4#if !(MIN_VERSION_base(4,8,0)) 5import Control.Applicative 6#endif 7import Control.Lens 8import GHC.Generics 9import Data.Data 10 11data Expr = Var Int | Pos Expr String | Neg Expr | Add Expr Expr deriving (Eq,Ord,Show,Read,Generic,Data,Typeable) 12data Stmt = Seq [Stmt] | Sel [Expr] | Let String Expr deriving (Eq,Ord,Show,Read,Generic,Data,Typeable) 13 14instance Plated Expr where 15 plate _ (Var x ) = pure (Var x) 16 plate f (Pos x y) = Pos <$> f x <*> pure y 17 plate f (Neg x ) = Neg <$> f x 18 plate f (Add x y) = Add <$> f x <*> f y 19 20instance Plated Stmt where 21 plate f (Seq xs) = Seq <$> traverse f xs 22 plate _ (Sel xs) = pure (Sel xs) 23 plate _ (Let x y) = pure (Let x y) 24 25exprs :: Traversal' Stmt Expr 26exprs f (Seq xs) = Seq <$> traverse (exprs f) xs 27exprs f (Sel xs) = Sel <$> traverse f xs 28exprs f (Let x y) = Let x <$> f y 29