classyplate-0.3.0.1: examples/DirectUni.hs
{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts #-}
module DirectUni where
import Data.Generics.Uniplate.Operations
import Data.Generics.Uniplate.Direct
import Example
import Generate
-- data A = ABC B C deriving (Show, Generic, Data)
-- data B = B | BA A deriving (Show, Generic, Data)
-- data C = CB B | CD D deriving (Show, Generic, Data)
-- data D = DDE D E | D deriving (Show, Generic, Data)
-- data E = E deriving (Show, Generic, Data)
instance Uniplate A where
uniplate (ABC b c) = plate ABC |+ b |+ c
instance Biplate A B where
biplate (ABC b c) = plate ABC |+ b |+ c
instance Biplate A C where
biplate (ABC b c) = plate ABC |+ b |+ c
instance Biplate A D where
biplate (ABC b c) = plate ABC |+ b |+ c
instance Biplate A E where
biplate (ABC b c) = plate ABC |+ b |+ c
instance Uniplate B where
uniplate (BA a) = plate BA |+ a
uniplate B = plate B
instance Biplate B A where
biplate (BA a) = plate BA |* a
biplate B = plate B
instance Biplate B C where
biplate (BA a) = plate BA |+ a
biplate B = plate B
instance Biplate B D where
biplate (BA a) = plate BA |+ a
biplate B = plate B
instance Biplate B E where
biplate (BA a) = plate BA |+ a
biplate B = plate B
instance Uniplate C where
uniplate (CB b) = plate CB |+ b
uniplate (CD d) = plate CD |- d
instance Biplate C A where
biplate (CB b) = plate CB |+ b
biplate (CD d) = plate CD |- d
instance Biplate C B where
biplate (CB b) = plate CB |+ b
biplate (CD d) = plate CD |- d
instance Biplate C D where
biplate (CB b) = plate CB |+ b
biplate (CD d) = plate CD |+ d
instance Biplate C E where
biplate (CB b) = plate CB |+ b
biplate (CD d) = plate CD |+ d
instance Uniplate D where
uniplate (DDE d e) = plate DDE |* d |- e
uniplate D = plate D
instance Biplate D A where
biplate (DDE d e) = plate DDE |- d |- e
biplate D = plate D
instance Biplate D B where
biplate (DDE d e) = plate DDE |- d |- e
biplate D = plate D
instance Biplate D C where
biplate (DDE d e) = plate DDE |- d |- e
biplate D = plate D
instance Biplate D E where
biplate (DDE d e) = plate DDE |+ d |* e
biplate D = plate D
instance Uniplate E where
uniplate E = plate E
instance Biplate E A where
biplate E = plate E
instance Biplate E B where
biplate E = plate E
instance Biplate E C where
biplate E = plate E
instance Biplate E D where
biplate E = plate E
instance Biplate A A where
biplate = plateSelf
instance Biplate B B where
biplate = plateSelf
instance Biplate C C where
biplate = plateSelf
instance Biplate D D where
biplate = plateSelf
instance Biplate E E where
biplate = plateSelf
directUni1 d = transformBi testFun1 (generateA d)
directUni2 d = transformBi testFun2 (generateA d)