{-# 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!