packages feed

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)