{-# LANGUAGE CPP #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Main ( main ) where import SAI.Data.Generics.Shape.SYB ( Homo, ghom, shapeOf, weightedShapeOf ) --import SAI.Data.Generics.Shape.SYB ( Rose(..) ) import Data.Data ( Data, Typeable ) --import Data.Data import Data.Generics.Aliases ( mkT ) import Data.Generics.Schemes ( everywhere ) --import Data.Generics ( Generic ) --import Data.Tree ( Tree(..) ) #if 1 data TA = A1 | A2 TB TA TB deriving ( Data, Typeable ) data TB = B TA deriving ( Data, Typeable ) exprAB = A2 (B A1) A1 (B A1) #else data TA = A1 | A2 TB deriving ( Data, Typeable ) data TB = B TA deriving ( Data, Typeable ) exprAB = A2 (B (A2 (B A1))) data TA = A1 String | A2 (Int,Int) TB deriving ( Data, Typeable ) --instance Data TA --instance Typeable TA --instance Generic TA data TB = B TA String deriving ( Data, Typeable ) --instance Data TB --instance Typeable TB --instance Generic TB --data TA = A1 String | A2 (Int,Int) TB deriving ( Data, Typeable ) --data TB = B TA String deriving ( Data, Typeable ) exprAB = A2 (2,5) (B (A1 "foo") "bar") #endif main = putStrLn $ show $ shapeOf exprAB --main = putStrLn $ show $ ( mkDataTree $ shapeOf exprAB :: Tree () ) --main = putStrLn $ show $ ( shapeOf exprAB :: Tree () ) --main = putStrLn $ show $ shapeOf ( exprAB :: TA ) --main = putStrLn $ show $ wtdShapeOf ( exprAB :: TA ) --main = putStrLn $ show $ wtdShapeOf ( [[1,2],[3],[4,5,6]] :: [[Int]] ) --main = putStrLn $ show $ wtdShapeOf [[1,2],[3],[4,5,6]] wtdShapeOf :: forall d. Data d => d -> Homo Int wtdShapeOf = ghom (const 1) (+) -- as of typing this line, battery died!