{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances,
             OverloadedStrings, StandaloneDeriving, TemplateHaskell, TypeFamilies #-}
{-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-}

-- | Concrete data types for Oberon constructs that make up its Abstract Syntax Tree. Every data type from this module
-- is an instance of a type family declared in "Language.Oberon.Abstract". This way it can be replaced by another data
-- type for another language while leaving other types to be reused.

module Language.Oberon.AST (module Language.Oberon.AST, RelOp(..)) where

import Control.Applicative (ZipList(ZipList, getZipList))
import Control.Monad (forM, mapM)
import Data.Data (Data, Typeable)
import Data.List.NonEmpty (NonEmpty((:|)))
import Data.Text (Text)

import qualified Transformation
import qualified Transformation.Shallow as Shallow
import qualified Transformation.Shallow.TH
import qualified Transformation.Deep.TH
import qualified Transformation.AG as AG
import qualified Rank2.TH

import qualified Language.Oberon.Abstract as Abstract
import Language.Oberon.Abstract (RelOp(..))

-- | Data type representing the Oberon language, both versions of it.
data Language = Language deriving (Typeable Language
DataType
Constr
Typeable Language
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Language -> c Language)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Language)
-> (Language -> Constr)
-> (Language -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Language))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language))
-> ((forall b. Data b => b -> b) -> Language -> Language)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Language -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Language -> r)
-> (forall u. (forall d. Data d => d -> u) -> Language -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Language -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> Data Language
Language -> DataType
Language -> Constr
(forall b. Data b => b -> b) -> Language -> Language
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
forall u. (forall d. Data d => d -> u) -> Language -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
$cLanguage :: Constr
$tLanguage :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapMp :: (forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapM :: (forall d. Data d => d -> m d) -> Language -> m Language
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapQi :: Int -> (forall d. Data d => d -> u) -> Language -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
gmapQ :: (forall d. Data d => d -> u) -> Language -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Language -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapT :: (forall b. Data b => b -> b) -> Language -> Language
$cgmapT :: (forall b. Data b => b -> b) -> Language -> Language
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Language)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
dataTypeOf :: Language -> DataType
$cdataTypeOf :: Language -> DataType
toConstr :: Language -> Constr
$ctoConstr :: Language -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
$cp1Data :: Typeable Language
Data, Typeable)

instance Abstract.Wirthy Language where
   type Module Language = Module Language
   type Declaration Language = Declaration Language
   type Type Language = Type Language
   type Statement Language = Statement Language
   type Expression Language = Expression Language
   type Designator Language = Designator Language
   type Value Language = Value Language

   type Import Language = Import Language
   type FieldList Language = FieldList Language
   type ProcedureHeading Language = ProcedureHeading Language
   type FormalParameters Language = FormalParameters Language
   type FPSection Language = FPSection Language
   type Block Language = Block Language
   type StatementSequence Language = StatementSequence Language
   type Case Language = Case Language
   type CaseLabels Language = CaseLabels Language
   type ConditionalBranch Language = ConditionalBranch Language
   type Element Language = Element Language

   type IdentDef Language = IdentDef Language
   type QualIdent Language = QualIdent Language

   -- Declaration
   constantDeclaration :: IdentDef l'
-> f (ConstExpression l' l' f' f') -> Declaration Language l' f' f
constantDeclaration = IdentDef l'
-> f (ConstExpression l' l' f' f') -> Declaration Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
IdentDef l -> f (ConstExpression l l f' f') -> Declaration λ l f' f
ConstantDeclaration
   typeDeclaration :: IdentDef l' -> f (Type l' l' f' f') -> Declaration Language l' f' f
typeDeclaration = IdentDef l' -> f (Type l' l' f' f') -> Declaration Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
IdentDef l -> f (Type l l f' f') -> Declaration λ l f' f
TypeDeclaration
   variableDeclaration :: IdentList l'
-> f (Type l' l' f' f') -> Declaration Language l' f' f
variableDeclaration = IdentList l'
-> f (Type l' l' f' f') -> Declaration Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
IdentList l -> f (Type l l f' f') -> Declaration λ l f' f
VariableDeclaration
   procedureDeclaration :: f (ProcedureHeading l' l' f' f')
-> f (Block l' l' f' f') -> Declaration Language l' f' f
procedureDeclaration = f (ProcedureHeading l' l' f' f')
-> f (Block l' l' f' f') -> Declaration Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (ProcedureHeading l l f' f')
-> f (Block l l f' f') -> Declaration λ l f' f
ProcedureDeclaration

   formalParameters :: [f (FPSection l' l' f' f')]
-> Maybe (ReturnType l') -> FormalParameters Language l' f' f
formalParameters = ZipList (f (FPSection l' l' f' f'))
-> Maybe (ReturnType l') -> FormalParameters Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (FPSection l l f' f'))
-> Maybe (ReturnType l) -> FormalParameters λ l f' f
FormalParameters (ZipList (f (FPSection l' l' f' f'))
 -> Maybe (ReturnType l') -> FormalParameters Language l' f' f)
-> ([f (FPSection l' l' f' f')]
    -> ZipList (f (FPSection l' l' f' f')))
-> [f (FPSection l' l' f' f')]
-> Maybe (ReturnType l')
-> FormalParameters Language l' f' f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [f (FPSection l' l' f' f')] -> ZipList (f (FPSection l' l' f' f'))
forall a. [a] -> ZipList a
ZipList
   fpSection :: Bool
-> [Ident] -> f (Type l' l' f' f') -> FPSection Language l' f' f
fpSection = Bool
-> [Ident] -> f (Type l' l' f' f') -> FPSection Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Bool -> [Ident] -> f (Type l l f' f') -> FPSection λ l f' f
FPSection
   block :: [f (Declaration l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Block Language l' f' f
block = ZipList (f (Declaration l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Block Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (Declaration l l f' f'))
-> Maybe (f (StatementSequence l l f' f')) -> Block λ l f' f
Block (ZipList (f (Declaration l' l' f' f'))
 -> Maybe (f (StatementSequence l' l' f' f'))
 -> Block Language l' f' f)
-> ([f (Declaration l' l' f' f')]
    -> ZipList (f (Declaration l' l' f' f')))
-> [f (Declaration l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Block Language l' f' f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [f (Declaration l' l' f' f')]
-> ZipList (f (Declaration l' l' f' f'))
forall a. [a] -> ZipList a
ZipList
   
   fieldList :: NonEmpty (IdentDef l')
-> f (Type l' l' f' f') -> FieldList Language l' f' f
fieldList = NonEmpty (IdentDef l')
-> f (Type l' l' f' f') -> FieldList Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
IdentList l -> f (Type l l f' f') -> FieldList λ l f' f
FieldList

   -- Type
   pointerType :: f (Type l' l' f' f') -> Type Language l' f' f
pointerType = f (Type l' l' f' f') -> Type Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Type l l f' f') -> Type λ l f' f
PointerType
   procedureType :: Maybe (f (FormalParameters l' l' f' f')) -> Type Language l' f' f
procedureType = Maybe (f (FormalParameters l' l' f' f')) -> Type Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (f (FormalParameters l l f' f')) -> Type λ l f' f
ProcedureType
   typeReference :: QualIdent l' -> Type Language l' f' f
typeReference = QualIdent l' -> Type Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
QualIdent l -> Type λ l f' f
TypeReference

   -- Statement
   assignment :: f (Designator l' l' f' f')
-> f (Expression l' l' f' f') -> Statement Language l' f' f
assignment = f (Designator l' l' f' f')
-> f (Expression l' l' f' f') -> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> f (Expression l l f' f') -> Statement λ l f' f
Assignment
   caseStatement :: f (Expression l' l' f' f')
-> [f (Case l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
caseStatement f (Expression l' l' f' f')
scrutinee [f (Case l' l' f' f')]
cases = f (Expression l' l' f' f')
-> ZipList (f (Case l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> ZipList (f (Case l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Statement λ l f' f
CaseStatement f (Expression l' l' f' f')
scrutinee ([f (Case l' l' f' f')] -> ZipList (f (Case l' l' f' f'))
forall a. [a] -> ZipList a
ZipList [f (Case l' l' f' f')]
cases)
   emptyStatement :: Statement Language l' f' f
emptyStatement = Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Statement λ l f' f
EmptyStatement
   exitStatement :: Statement Language l' f' f
exitStatement = Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Statement λ l f' f
Exit
   ifStatement :: NonEmpty (f (ConditionalBranch l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
ifStatement (f (ConditionalBranch l' l' f' f')
branch :| [f (ConditionalBranch l' l' f' f')]
branches) = f (ConditionalBranch l' l' f' f')
-> ZipList (f (ConditionalBranch l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (ConditionalBranch l l f' f')
-> ZipList (f (ConditionalBranch l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Statement λ l f' f
If f (ConditionalBranch l' l' f' f')
branch ([f (ConditionalBranch l' l' f' f')]
-> ZipList (f (ConditionalBranch l' l' f' f'))
forall a. [a] -> ZipList a
ZipList [f (ConditionalBranch l' l' f' f')]
branches)
   loopStatement :: f (StatementSequence l' l' f' f') -> Statement Language l' f' f
loopStatement = f (StatementSequence l' l' f' f') -> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (StatementSequence l l f' f') -> Statement λ l f' f
Loop
   procedureCall :: f (Designator l' l' f' f')
-> Maybe [f (Expression l' l' f' f')] -> Statement Language l' f' f
procedureCall f (Designator l' l' f' f')
proc Maybe [f (Expression l' l' f' f')]
args = f (Designator l' l' f' f')
-> Maybe (ZipList (f (Expression l' l' f' f')))
-> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> Maybe (ZipList (f (Expression l l f' f'))) -> Statement λ l f' f
ProcedureCall f (Designator l' l' f' f')
proc ([f (Expression l' l' f' f')]
-> ZipList (f (Expression l' l' f' f'))
forall a. [a] -> ZipList a
ZipList ([f (Expression l' l' f' f')]
 -> ZipList (f (Expression l' l' f' f')))
-> Maybe [f (Expression l' l' f' f')]
-> Maybe (ZipList (f (Expression l' l' f' f')))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [f (Expression l' l' f' f')]
args)
   repeatStatement :: f (StatementSequence l' l' f' f')
-> f (Expression l' l' f' f') -> Statement Language l' f' f
repeatStatement = f (StatementSequence l' l' f' f')
-> f (Expression l' l' f' f') -> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (StatementSequence l l f' f')
-> f (Expression l l f' f') -> Statement λ l f' f
Repeat
   returnStatement :: Maybe (f (Expression l' l' f' f')) -> Statement Language l' f' f
returnStatement = Maybe (f (Expression l' l' f' f')) -> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (f (Expression l l f' f')) -> Statement λ l f' f
Return
   whileStatement :: f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f') -> Statement Language l' f' f
whileStatement = f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f') -> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (StatementSequence l l f' f') -> Statement λ l f' f
While

   conditionalBranch :: f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f')
-> ConditionalBranch Language l' f' f
conditionalBranch = f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f')
-> ConditionalBranch Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (StatementSequence l l f' f') -> ConditionalBranch λ l f' f
ConditionalBranch
   caseAlternative :: NonEmpty (f (CaseLabels l' l' f' f'))
-> f (StatementSequence l' l' f' f') -> Case Language l' f' f
caseAlternative (f (CaseLabels l' l' f' f')
c :| [f (CaseLabels l' l' f' f')]
cs) = f (CaseLabels l' l' f' f')
-> ZipList (f (CaseLabels l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Case Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (CaseLabels l l f' f')
-> ZipList (f (CaseLabels l l f' f'))
-> f (StatementSequence l l f' f')
-> Case λ l f' f
Case f (CaseLabels l' l' f' f')
c ([f (CaseLabels l' l' f' f')]
-> ZipList (f (CaseLabels l' l' f' f'))
forall a. [a] -> ZipList a
ZipList [f (CaseLabels l' l' f' f')]
cs)
   labelRange :: f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f') -> CaseLabels Language l' f' f
labelRange = f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f') -> CaseLabels Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (ConstExpression l l f' f')
-> f (ConstExpression l l f' f') -> CaseLabels λ l f' f
LabelRange
   singleLabel :: f (ConstExpression l' l' f' f') -> CaseLabels Language l' f' f
singleLabel = f (ConstExpression l' l' f' f') -> CaseLabels Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (ConstExpression l l f' f') -> CaseLabels λ l f' f
SingleLabel
   
   statementSequence :: [f (Statement l' l' f' f')] -> StatementSequence Language l' f' f
statementSequence = ZipList (f (Statement l' l' f' f'))
-> StatementSequence Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (Statement l l f' f')) -> StatementSequence λ l f' f
StatementSequence (ZipList (f (Statement l' l' f' f'))
 -> StatementSequence Language l' f' f)
-> ([f (Statement l' l' f' f')]
    -> ZipList (f (Statement l' l' f' f')))
-> [f (Statement l' l' f' f')]
-> StatementSequence Language l' f' f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [f (Statement l' l' f' f')] -> ZipList (f (Statement l' l' f' f'))
forall a. [a] -> ZipList a
ZipList

   -- Expression
   add :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
add = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Add
   and :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
and = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
And
   divide :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
divide = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Divide
   functionCall :: f (Designator l' l' f' f')
-> [f (Expression l' l' f' f')] -> Expression Language l' f' f
functionCall f (Designator l' l' f' f')
fun [f (Expression l' l' f' f')]
args = f (Designator l' l' f' f')
-> ZipList (f (Expression l' l' f' f'))
-> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> ZipList (f (Expression l l f' f')) -> Expression λ l f' f
FunctionCall f (Designator l' l' f' f')
fun ([f (Expression l' l' f' f')]
-> ZipList (f (Expression l' l' f' f'))
forall a. [a] -> ZipList a
ZipList [f (Expression l' l' f' f')]
args)
   integerDivide :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
integerDivide = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
IntegerDivide
   literal :: f (Value l' l' f' f') -> Expression Language l' f' f
literal = f (Value l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Value l l f' f') -> Expression λ l f' f
Literal
   modulo :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
modulo = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Modulo
   multiply :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
multiply = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Multiply
   negative :: f (Expression l' l' f' f') -> Expression Language l' f' f
negative = f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Expression λ l f' f
Negative
   not :: f (Expression l' l' f' f') -> Expression Language l' f' f
not = f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Expression λ l f' f
Not
   or :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
or = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Or
   positive :: f (Expression l' l' f' f') -> Expression Language l' f' f
positive = f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Expression λ l f' f
Positive
   read :: f (Designator l' l' f' f') -> Expression Language l' f' f
read = f (Designator l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f') -> Expression λ l f' f
Read
   relation :: RelOp
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Expression Language l' f' f
relation = RelOp
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
RelOp
-> f (Expression l l f' f')
-> f (Expression l l f' f')
-> Expression λ l f' f
Relation
   subtract :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
subtract = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Expression λ l f' f
Subtract

   element :: f (Expression l' l' f' f') -> Element Language l' f' f
element = f (Expression l' l' f' f') -> Element Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> Element λ l f' f
Element
   range :: f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Element Language l' f' f
range = f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Element Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f')
-> f (Expression l l f' f') -> Element λ l f' f
Range

   -- Value
   builtin :: Ident -> Value Language l' f' f
builtin = Ident -> Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Ident -> Value λ l f' f
Builtin
   charCode :: Int -> Value Language l' f' f
charCode = Int -> Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Int -> Value λ l f' f
CharCode
   false :: Value Language l' f' f
false = Bool -> Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Bool -> Value λ l f' f
Boolean Bool
False
   integer :: Integer -> Value Language l' f' f
integer = Integer -> Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Integer -> Value λ l f' f
Integer
   nil :: Value Language l' f' f
nil = Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Value λ l f' f
Nil
   real :: Double -> Value Language l' f' f
real = Double -> Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Double -> Value λ l f' f
Real
   string :: Ident -> Value Language l' f' f
string = Ident -> Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Ident -> Value λ l f' f
String
   true :: Value Language l' f' f
true = Bool -> Value Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *). Bool -> Value λ l f' f
Boolean Bool
True

   -- Designator
   variable :: QualIdent l' -> Designator Language l' f' f
variable = QualIdent l' -> Designator Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
QualIdent l -> Designator λ l f' f
Variable
   field :: f (Designator l' l' f' f') -> Ident -> Designator Language l' f' f
field = f (Designator l' l' f' f') -> Ident -> Designator Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f') -> Ident -> Designator λ l f' f
Field
   index :: f (Designator l' l' f' f')
-> NonEmpty (f (Expression l' l' f' f'))
-> Designator Language l' f' f
index f (Designator l' l' f' f')
array (f (Expression l' l' f' f')
i :| [f (Expression l' l' f' f')]
is) = f (Designator l' l' f' f')
-> f (Expression l' l' f' f')
-> ZipList (f (Expression l' l' f' f'))
-> Designator Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f')
-> f (Expression l l f' f')
-> ZipList (f (Expression l l f' f'))
-> Designator λ l f' f
Index f (Designator l' l' f' f')
array f (Expression l' l' f' f')
i ([f (Expression l' l' f' f')]
-> ZipList (f (Expression l' l' f' f'))
forall a. [a] -> ZipList a
ZipList [f (Expression l' l' f' f')]
is)
   dereference :: f (Designator l' l' f' f') -> Designator Language l' f' f
dereference = f (Designator l' l' f' f') -> Designator Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f') -> Designator λ l f' f
Dereference

   -- Identifier
   identDef :: Ident -> IdentDef Language
identDef = (Ident -> AccessMode -> IdentDef Language)
-> AccessMode -> Ident -> IdentDef Language
forall a b c. (a -> b -> c) -> b -> a -> c
flip Ident -> AccessMode -> IdentDef Language
forall l. Ident -> AccessMode -> IdentDef l
IdentDef AccessMode
PrivateOnly
   nonQualIdent :: Ident -> QualIdent Language
nonQualIdent = Ident -> QualIdent Language
forall l. Ident -> QualIdent l
NonQualIdent

instance Abstract.CoWirthy Language where
   type TargetClass Language = Abstract.Oberon2
   coDeclaration :: Declaration Language l'' f' f -> Declaration l' l'' f' f
coDeclaration (ConstantDeclaration name value) = IdentDef l''
-> f (ConstExpression l'' l'' f' f') -> Declaration l' l'' f' f
forall l l' (f :: * -> *) (f' :: * -> *).
Wirthy l =>
IdentDef l'
-> f (ConstExpression l' l' f' f') -> Declaration l l' f' f
Abstract.constantDeclaration IdentDef l''
name f (ConstExpression l'' l'' f' f')
value
   coDeclaration (TypeDeclaration name ty) = IdentDef l'' -> f (Type l'' l'' f' f') -> Declaration l' l'' f' f
forall l l' (f :: * -> *) (f' :: * -> *).
Wirthy l =>
IdentDef l' -> f (Type l' l' f' f') -> Declaration l l' f' f
Abstract.typeDeclaration IdentDef l''
name f (Type l'' l'' f' f')
ty
   coDeclaration (VariableDeclaration name ty) = IdentList l'' -> f (Type l'' l'' f' f') -> Declaration l' l'' f' f
forall l l' (f :: * -> *) (f' :: * -> *).
Wirthy l =>
IdentList l' -> f (Type l' l' f' f') -> Declaration l l' f' f
Abstract.variableDeclaration IdentList l''
name f (Type l'' l'' f' f')
ty
   coDeclaration (ProcedureDeclaration heading body) = f (ProcedureHeading l'' l'' f' f')
-> f (Block l'' l'' f' f') -> Declaration l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (ProcedureHeading l' l' f' f')
-> f (Block l' l' f' f') -> Declaration l l' f' f
Abstract.procedureDeclaration f (ProcedureHeading l'' l'' f' f')
heading f (Block l'' l'' f' f')
body
   coDeclaration (ForwardDeclaration name params) = IdentDef l''
-> Maybe (f (FormalParameters l'' l'' f' f'))
-> Declaration l' l'' f' f
forall l l' (f :: * -> *) (f' :: * -> *).
Oberon l =>
IdentDef l'
-> Maybe (f (FormalParameters l' l' f' f'))
-> Declaration l l' f' f
Abstract.forwardDeclaration IdentDef l''
name Maybe (f (FormalParameters l'' l'' f' f'))
params
   
   coType :: Type Language l'' f' f -> Type l' l'' f' f
coType (TypeReference q) = QualIdent l'' -> Type l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
QualIdent l' -> Type l l' f' f
Abstract.typeReference QualIdent l''
q
   coType (ProcedureType params) = Maybe (f (FormalParameters l'' l'' f' f')) -> Type l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
Maybe (f (FormalParameters l' l' f' f')) -> Type l l' f' f
Abstract.procedureType Maybe (f (FormalParameters l'' l'' f' f'))
params
   coType (PointerType destination) = f (Type l'' l'' f' f') -> Type l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Type l' l' f' f') -> Type l l' f' f
Abstract.pointerType f (Type l'' l'' f' f')
destination
   coType (ArrayType dimensions itemType) = [f (ConstExpression l'' l'' f' f')]
-> f (Type l'' l'' f' f') -> Type l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Oberon l =>
[f (ConstExpression l' l' f' f')]
-> f (Type l' l' f' f') -> Type l l' f' f
Abstract.arrayType (ZipList (f (ConstExpression l'' l'' f' f'))
-> [f (ConstExpression l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (ConstExpression l'' l'' f' f'))
dimensions) f (Type l'' l'' f' f')
itemType
   coType (RecordType baseType fields) = Maybe (QualIdent l'')
-> [f (FieldList l'' l'' f' f')] -> Type l' l'' f' f
forall l l' (f :: * -> *) (f' :: * -> *).
Oberon l =>
Maybe (BaseType l')
-> [f (FieldList l' l' f' f')] -> Type l l' f' f
Abstract.recordType Maybe (QualIdent l'')
baseType (ZipList (f (FieldList l'' l'' f' f'))
-> [f (FieldList l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (FieldList l'' l'' f' f'))
fields)
   
   coStatement :: Statement Language l'' f' f -> Statement l' l'' f' f
coStatement Statement Language l'' f' f
EmptyStatement = Statement l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Statement l l' f' f
Abstract.emptyStatement
   coStatement (Assignment destination expression) = f (Designator l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> f (Expression l' l' f' f') -> Statement l l' f' f
Abstract.assignment f (Designator l'' l'' f' f')
destination f (Expression l'' l'' f' f')
expression
   coStatement (ProcedureCall procedure parameters) = f (Designator l'' l'' f' f')
-> Maybe [f (Expression l'' l'' f' f')] -> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> Maybe [f (Expression l' l' f' f')] -> Statement l l' f' f
Abstract.procedureCall f (Designator l'' l'' f' f')
procedure (Maybe [f (Expression l'' l'' f' f')] -> Statement l' l'' f' f)
-> Maybe [f (Expression l'' l'' f' f')] -> Statement l' l'' f' f
forall a b. (a -> b) -> a -> b
$ ZipList (f (Expression l'' l'' f' f'))
-> [f (Expression l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList (ZipList (f (Expression l'' l'' f' f'))
 -> [f (Expression l'' l'' f' f')])
-> Maybe (ZipList (f (Expression l'' l'' f' f')))
-> Maybe [f (Expression l'' l'' f' f')]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (ZipList (f (Expression l'' l'' f' f')))
parameters
   coStatement (If branch elsifs fallback) = NonEmpty (f (ConditionalBranch l'' l'' f' f'))
-> Maybe (f (StatementSequence l'' l'' f' f'))
-> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
NonEmpty (f (ConditionalBranch l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f')) -> Statement l l' f' f
Abstract.ifStatement (f (ConditionalBranch l'' l'' f' f')
branch f (ConditionalBranch l'' l'' f' f')
-> [f (ConditionalBranch l'' l'' f' f')]
-> NonEmpty (f (ConditionalBranch l'' l'' f' f'))
forall a. a -> [a] -> NonEmpty a
:| ZipList (f (ConditionalBranch l'' l'' f' f'))
-> [f (ConditionalBranch l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (ConditionalBranch l'' l'' f' f'))
elsifs) Maybe (f (StatementSequence l'' l'' f' f'))
fallback
   coStatement (CaseStatement scrutinee cases fallback) = f (Expression l'' l'' f' f')
-> [f (Case l'' l'' f' f')]
-> Maybe (f (StatementSequence l'' l'' f' f'))
-> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> [f (Case l' l' f' f')]
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement l l' f' f
Abstract.caseStatement f (Expression l'' l'' f' f')
scrutinee (ZipList (f (Case l'' l'' f' f')) -> [f (Case l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (Case l'' l'' f' f'))
cases) Maybe (f (StatementSequence l'' l'' f' f'))
fallback
   coStatement (While condition body) = f (Expression l'' l'' f' f')
-> f (StatementSequence l'' l'' f' f') -> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (StatementSequence l' l' f' f') -> Statement l l' f' f
Abstract.whileStatement f (Expression l'' l'' f' f')
condition f (StatementSequence l'' l'' f' f')
body
   coStatement (Repeat body condition) = f (StatementSequence l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (StatementSequence l' l' f' f')
-> f (Expression l' l' f' f') -> Statement l l' f' f
Abstract.repeatStatement f (StatementSequence l'' l'' f' f')
body f (Expression l'' l'' f' f')
condition
   coStatement (For index from to by body) = Ident
-> f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f')
-> Maybe (f (Expression l'' l'' f' f'))
-> f (StatementSequence l'' l'' f' f')
-> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Oberon2 l =>
Ident
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Statement l l' f' f
Abstract.forStatement Ident
index f (Expression l'' l'' f' f')
from f (Expression l'' l'' f' f')
to Maybe (f (Expression l'' l'' f' f'))
by f (StatementSequence l'' l'' f' f')
body
   coStatement (Loop body) = f (StatementSequence l'' l'' f' f') -> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (StatementSequence l' l' f' f') -> Statement l l' f' f
Abstract.loopStatement f (StatementSequence l'' l'' f' f')
body
   coStatement (With alternative alternatives fallback) =
      NonEmpty (f (WithAlternative l'' l'' f' f'))
-> Maybe (f (StatementSequence l'' l'' f' f'))
-> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Oberon2 l =>
NonEmpty (f (WithAlternative l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f')) -> Statement l l' f' f
Abstract.variantWithStatement (f (WithAlternative l'' l'' f' f')
alternative f (WithAlternative l'' l'' f' f')
-> [f (WithAlternative l'' l'' f' f')]
-> NonEmpty (f (WithAlternative l'' l'' f' f'))
forall a. a -> [a] -> NonEmpty a
:| ZipList (f (WithAlternative l'' l'' f' f'))
-> [f (WithAlternative l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (WithAlternative l'' l'' f' f'))
alternatives) Maybe (f (StatementSequence l'' l'' f' f'))
fallback
   coStatement Statement Language l'' f' f
Exit = Statement l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Statement l l' f' f
Abstract.exitStatement
   coStatement (Return result) = Maybe (f (Expression l'' l'' f' f')) -> Statement l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
Maybe (f (Expression l' l' f' f')) -> Statement l l' f' f
Abstract.returnStatement Maybe (f (Expression l'' l'' f' f'))
result
   
   coExpression :: Expression Language l'' f' f -> Expression l' l'' f' f
coExpression (Relation op left right) = RelOp
-> f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f')
-> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
RelOp
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Expression l l' f' f
Abstract.relation RelOp
op f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (IsA scrutinee typeName) = f (Expression l'' l'' f' f')
-> QualIdent l'' -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Oberon l =>
f (Expression l' l' f' f') -> QualIdent l' -> Expression l l' f' f
Abstract.is f (Expression l'' l'' f' f')
scrutinee QualIdent l''
typeName
   coExpression (Positive e) = f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.positive f (Expression l'' l'' f' f')
e
   coExpression (Negative e) = f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.negative f (Expression l'' l'' f' f')
e
   coExpression (Add left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.add f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (Subtract left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.subtract f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (Or left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.or f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (Multiply left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.multiply f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (Divide left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.divide f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (IntegerDivide left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.integerDivide f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (Modulo left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.modulo f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (And left right) = f (Expression l'' l'' f' f')
-> f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f')
-> f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.and f (Expression l'' l'' f' f')
left f (Expression l'' l'' f' f')
right
   coExpression (Set elements) = [f (Element l'' l'' f' f')] -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Oberon l =>
[f (Element l' l' f' f')] -> Expression l l' f' f
Abstract.set (ZipList (f (Element l'' l'' f' f')) -> [f (Element l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (Element l'' l'' f' f'))
elements)
   coExpression (Read var) = f (Designator l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f') -> Expression l l' f' f
Abstract.read f (Designator l'' l'' f' f')
var
   coExpression (FunctionCall function parameters) = f (Designator l'' l'' f' f')
-> [f (Expression l'' l'' f' f')] -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> [f (Expression l' l' f' f')] -> Expression l l' f' f
Abstract.functionCall f (Designator l'' l'' f' f')
function ([f (Expression l'' l'' f' f')] -> Expression l' l'' f' f)
-> [f (Expression l'' l'' f' f')] -> Expression l' l'' f' f
forall a b. (a -> b) -> a -> b
$ ZipList (f (Expression l'' l'' f' f'))
-> [f (Expression l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (Expression l'' l'' f' f'))
parameters
   coExpression (Not e) = f (Expression l'' l'' f' f') -> Expression l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Expression l' l' f' f') -> Expression l l' f' f
Abstract.not f (Expression l'' l'' f' f')
e

   coValue :: Value Language l'' f' f -> Value l' l'' f' f
coValue Value Language l'' f' f
Nil = Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Value l l' f' f
Abstract.nil
   coValue (Boolean False) = Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Value l l' f' f
Abstract.false
   coValue (Boolean True) = Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Value l l' f' f
Abstract.true
   coValue (Builtin name) = Ident -> Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Ident -> Value l l' f' f
Abstract.builtin Ident
name
   coValue (Integer n) = Integer -> Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Integer -> Value l l' f' f
Abstract.integer Integer
n
   coValue (Real r) = Double -> Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Double -> Value l l' f' f
Abstract.real Double
r
   coValue (String s) = Ident -> Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Ident -> Value l l' f' f
Abstract.string Ident
s
   coValue (CharCode c) = Int -> Value l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
Int -> Value l l' f' f
Abstract.charCode Int
c
   
   coDesignator :: Designator Language l'' f' f -> Designator l' l'' f' f
coDesignator (Variable q) = QualIdent l'' -> Designator l' l'' f' f
forall l l' (f' :: * -> *) (f :: * -> *).
Wirthy l =>
QualIdent l' -> Designator l l' f' f
Abstract.variable QualIdent l''
q
   coDesignator (Field record name) = f (Designator l'' l'' f' f') -> Ident -> Designator l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f') -> Ident -> Designator l l' f' f
Abstract.field f (Designator l'' l'' f' f')
record Ident
name
   coDesignator (Index array index indexes) = f (Designator l'' l'' f' f')
-> NonEmpty (f (Expression l'' l'' f' f'))
-> Designator l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f')
-> NonEmpty (f (Expression l' l' f' f')) -> Designator l l' f' f
Abstract.index f (Designator l'' l'' f' f')
array (f (Expression l'' l'' f' f')
index f (Expression l'' l'' f' f')
-> [f (Expression l'' l'' f' f')]
-> NonEmpty (f (Expression l'' l'' f' f'))
forall a. a -> [a] -> NonEmpty a
:| ZipList (f (Expression l'' l'' f' f'))
-> [f (Expression l'' l'' f' f')]
forall a. ZipList a -> [a]
getZipList ZipList (f (Expression l'' l'' f' f'))
indexes)
   coDesignator (TypeGuard scrutinee typeName) = f (Designator l'' l'' f' f')
-> QualIdent l'' -> Designator l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Oberon l =>
f (Designator l' l' f' f') -> QualIdent l' -> Designator l l' f' f
Abstract.typeGuard f (Designator l'' l'' f' f')
scrutinee QualIdent l''
typeName
   coDesignator (Dereference pointer) = f (Designator l'' l'' f' f') -> Designator l' l'' f' f
forall l (f :: * -> *) l' (f' :: * -> *).
Wirthy l =>
f (Designator l' l' f' f') -> Designator l l' f' f
Abstract.dereference f (Designator l'' l'' f' f')
pointer

instance Abstract.Nameable Language where
   getProcedureName :: ProcedureHeading Language l' f' f -> Ident
getProcedureName (ProcedureHeading _ iddef _) = IdentDef l' -> Ident
forall l. Nameable l => IdentDef l -> Ident
Abstract.getIdentDefName IdentDef l'
iddef
   getProcedureName (TypeBoundHeading _ _ _ _ iddef _) = IdentDef l' -> Ident
forall l. Nameable l => IdentDef l -> Ident
Abstract.getIdentDefName IdentDef l'
iddef
   getIdentDefName :: IdentDef Language -> Ident
getIdentDefName (IdentDef name _) = Ident
name
   getNonQualIdentName :: QualIdent Language -> Maybe Ident
getNonQualIdentName (NonQualIdent name) = Ident -> Maybe Ident
forall a. a -> Maybe a
Just Ident
name
   getNonQualIdentName QualIdent Language
_ = Maybe Ident
forall a. Maybe a
Nothing

isNamedVar :: Abstract.Nameable l => Ident -> Maybe (Designator Language l f f) -> Bool
isNamedVar :: Ident -> Maybe (Designator Language l f f) -> Bool
isNamedVar Ident
name (Just (Variable QualIdent l
q)) | QualIdent l -> Maybe Ident
forall l. Nameable l => QualIdent l -> Maybe Ident
Abstract.getNonQualIdentName QualIdent l
q Maybe Ident -> Maybe Ident -> Bool
forall a. Eq a => a -> a -> Bool
== Ident -> Maybe Ident
forall a. a -> Maybe a
Just Ident
name = Bool
True
isNamedVar Ident
_ Maybe (Designator Language l f f)
_ = Bool
False

instance Abstract.Oberon Language where
   type WithAlternative Language = WithAlternative Language
   moduleUnit :: Ident
-> [Import Language]
-> f (Block l' l' f' f')
-> Module Language l' f' f
moduleUnit = Ident
-> [Import Language]
-> f (Block l' l' f' f')
-> Module Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Ident -> [Import l] -> f (Block l l f' f') -> Module λ l f' f
Module
   moduleImport :: Maybe Ident -> Ident -> Import Language
moduleImport = (,)
   exported :: Ident -> IdentDef Language
exported = (Ident -> AccessMode -> IdentDef Language)
-> AccessMode -> Ident -> IdentDef Language
forall a b c. (a -> b -> c) -> b -> a -> c
flip Ident -> AccessMode -> IdentDef Language
forall l. Ident -> AccessMode -> IdentDef l
IdentDef AccessMode
Exported
   qualIdent :: Ident -> Ident -> QualIdent Language
qualIdent = Ident -> Ident -> QualIdent Language
forall l. Ident -> Ident -> QualIdent l
QualIdent
   getQualIdentNames :: QualIdent Language -> Maybe (Ident, Ident)
getQualIdentNames (QualIdent moduleName name) = (Ident, Ident) -> Maybe (Ident, Ident)
forall a. a -> Maybe a
Just (Ident
moduleName, Ident
name)
   getQualIdentNames QualIdent Language
_ = Maybe (Ident, Ident)
forall a. Maybe a
Nothing

   arrayType :: [f (ConstExpression l' l' f' f')]
-> f (Type l' l' f' f') -> Type Language l' f' f
arrayType = ZipList (f (ConstExpression l' l' f' f'))
-> f (Type l' l' f' f') -> Type Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (ConstExpression l l f' f'))
-> f (Type l l f' f') -> Type λ l f' f
ArrayType (ZipList (f (ConstExpression l' l' f' f'))
 -> f (Type l' l' f' f') -> Type Language l' f' f)
-> ([f (ConstExpression l' l' f' f')]
    -> ZipList (f (ConstExpression l' l' f' f')))
-> [f (ConstExpression l' l' f' f')]
-> f (Type l' l' f' f')
-> Type Language l' f' f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [f (ConstExpression l' l' f' f')]
-> ZipList (f (ConstExpression l' l' f' f'))
forall a. [a] -> ZipList a
ZipList
   recordType :: Maybe (BaseType l')
-> [f (FieldList l' l' f' f')] -> Type Language l' f' f
recordType Maybe (BaseType l')
base [f (FieldList l' l' f' f')]
fields = Maybe (BaseType l')
-> ZipList (f (FieldList l' l' f' f')) -> Type Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Maybe (QualIdent l)
-> ZipList (f (FieldList l l f' f')) -> Type λ l f' f
RecordType Maybe (BaseType l')
base ([f (FieldList l' l' f' f')] -> ZipList (f (FieldList l' l' f' f'))
forall a. [a] -> ZipList a
ZipList [f (FieldList l' l' f' f')]
fields)
   procedureHeading :: Bool
-> IdentDef l'
-> Maybe (f (FormalParameters l' l' f' f'))
-> ProcedureHeading Language l' f' f
procedureHeading = Bool
-> IdentDef l'
-> Maybe (f (FormalParameters l' l' f' f'))
-> ProcedureHeading Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Bool
-> IdentDef l
-> Maybe (f (FormalParameters l l f' f'))
-> ProcedureHeading λ l f' f
ProcedureHeading
   forwardDeclaration :: IdentDef l'
-> Maybe (f (FormalParameters l' l' f' f'))
-> Declaration Language l' f' f
forwardDeclaration = IdentDef l'
-> Maybe (f (FormalParameters l' l' f' f'))
-> Declaration Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
IdentDef l
-> Maybe (f (FormalParameters l l f' f')) -> Declaration λ l f' f
ForwardDeclaration
   withStatement :: f (WithAlternative l' l' f' f') -> Statement Language l' f' f
withStatement f (WithAlternative l' l' f' f')
alt = f (WithAlternative l' l' f' f')
-> ZipList (f (WithAlternative l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (WithAlternative l l f' f')
-> ZipList (f (WithAlternative l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Statement λ l f' f
With f (WithAlternative l' l' f' f')
alt ([f (WithAlternative l' l' f' f')]
-> ZipList (f (WithAlternative l' l' f' f'))
forall a. [a] -> ZipList a
ZipList []) Maybe (f (StatementSequence l' l' f' f'))
forall a. Maybe a
Nothing
   withAlternative :: QualIdent l'
-> QualIdent l'
-> f (StatementSequence l' l' f' f')
-> WithAlternative Language l' f' f
withAlternative = QualIdent l'
-> QualIdent l'
-> f (StatementSequence l' l' f' f')
-> WithAlternative Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
QualIdent l
-> QualIdent l
-> f (StatementSequence l l f' f')
-> WithAlternative λ l f' f
WithAlternative
   is :: f (Expression l' l' f' f')
-> QualIdent l' -> Expression Language l' f' f
is = f (Expression l' l' f' f')
-> QualIdent l' -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Expression l l f' f') -> QualIdent l -> Expression λ l f' f
IsA
   set :: [f (Element l' l' f' f')] -> Expression Language l' f' f
set = ZipList (f (Element l' l' f' f')) -> Expression Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
ZipList (f (Element l l f' f')) -> Expression λ l f' f
Set (ZipList (f (Element l' l' f' f')) -> Expression Language l' f' f)
-> ([f (Element l' l' f' f')] -> ZipList (f (Element l' l' f' f')))
-> [f (Element l' l' f' f')]
-> Expression Language l' f' f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [f (Element l' l' f' f')] -> ZipList (f (Element l' l' f' f'))
forall a. [a] -> ZipList a
ZipList
   typeGuard :: f (Designator l' l' f' f')
-> QualIdent l' -> Designator Language l' f' f
typeGuard = f (Designator l' l' f' f')
-> QualIdent l' -> Designator Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (Designator l l f' f') -> QualIdent l -> Designator λ l f' f
TypeGuard

instance Abstract.Oberon2 Language where
   readOnly :: Ident -> IdentDef Language
readOnly = (Ident -> AccessMode -> IdentDef Language)
-> AccessMode -> Ident -> IdentDef Language
forall a b c. (a -> b -> c) -> b -> a -> c
flip Ident -> AccessMode -> IdentDef Language
forall l. Ident -> AccessMode -> IdentDef l
IdentDef AccessMode
ReadOnly
   typeBoundHeading :: Bool
-> Ident
-> Ident
-> Bool
-> IdentDef l'
-> Maybe (f (FormalParameters l' l' f' f'))
-> ProcedureHeading Language l' f' f
typeBoundHeading = Bool
-> Ident
-> Ident
-> Bool
-> IdentDef l'
-> Maybe (f (FormalParameters l' l' f' f'))
-> ProcedureHeading Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Bool
-> Ident
-> Ident
-> Bool
-> IdentDef l
-> Maybe (f (FormalParameters l l f' f'))
-> ProcedureHeading λ l f' f
TypeBoundHeading
   forStatement :: Ident
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Statement Language l' f' f
forStatement = Ident
-> f (Expression l' l' f' f')
-> f (Expression l' l' f' f')
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
Ident
-> f (Expression l l f' f')
-> f (Expression l l f' f')
-> Maybe (f (Expression l l f' f'))
-> f (StatementSequence l l f' f')
-> Statement λ l f' f
For
   variantWithStatement :: NonEmpty (f (WithAlternative l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
variantWithStatement (f (WithAlternative l' l' f' f')
variant :| [f (WithAlternative l' l' f' f')]
variants) = f (WithAlternative l' l' f' f')
-> ZipList (f (WithAlternative l' l' f' f'))
-> Maybe (f (StatementSequence l' l' f' f'))
-> Statement Language l' f' f
forall λ l (f' :: * -> *) (f :: * -> *).
f (WithAlternative l l f' f')
-> ZipList (f (WithAlternative l l f' f'))
-> Maybe (f (StatementSequence l l f' f'))
-> Statement λ l f' f
With f (WithAlternative l' l' f' f')
variant ([f (WithAlternative l' l' f' f')]
-> ZipList (f (WithAlternative l' l' f' f'))
forall a. [a] -> ZipList a
ZipList [f (WithAlternative l' l' f' f')]
variants)

data Module λ l f' f = Module Ident [Import l] (f (Abstract.Block l l f' f'))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.Import l),
                   Data (f (Abstract.Block l l f' f'))) =>
                  Data (Module λ l f' f)
deriving instance (Show (Abstract.Import l), Show (f (Abstract.Block l l f' f'))) => Show (Module λ l f' f)

type Ident = Text

type Import l = (Maybe Ident, Ident)

data Declaration λ l f' f = ConstantDeclaration (Abstract.IdentDef l) (f (Abstract.ConstExpression l l f' f'))
                          | TypeDeclaration (Abstract.IdentDef l) (f (Abstract.Type l l f' f'))
                          | VariableDeclaration (Abstract.IdentList l) (f (Abstract.Type l l f' f'))
                          | ProcedureDeclaration (f (Abstract.ProcedureHeading l l f' f'))
                                                 (f (Abstract.Block l l f' f'))
                          | ForwardDeclaration (Abstract.IdentDef l) (Maybe (f (Abstract.FormalParameters l l f' f')))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
                   Data (f (Abstract.Type l l f' f')), Data (f (Abstract.ConstExpression l l f' f')),
                   Data (f (Abstract.FormalParameters l l f' f')), Data (f (Abstract.ProcedureHeading l l f' f')),
                   Data (f (Abstract.Block l l f' f')), Data (Abstract.IdentDef l)) => Data (Declaration λ l f' f)
deriving instance (Show (f (Abstract.Type l l f' f')), Show (f (Abstract.ConstExpression l l f' f')),
                   Show (f (Abstract.FormalParameters l l f' f')), Show (f (Abstract.ProcedureHeading l l f' f')),
                   Show (f (Abstract.Block l l f' f')), Show (Abstract.IdentDef l)) => Show (Declaration λ l f' f)

data QualIdent l = QualIdent Ident Ident 
                 | NonQualIdent Ident
   deriving (Typeable (QualIdent l)
DataType
Constr
Typeable (QualIdent l)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> QualIdent l -> c (QualIdent l))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (QualIdent l))
-> (QualIdent l -> Constr)
-> (QualIdent l -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (QualIdent l)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (QualIdent l)))
-> ((forall b. Data b => b -> b) -> QualIdent l -> QualIdent l)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> QualIdent l -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> QualIdent l -> r)
-> (forall u. (forall d. Data d => d -> u) -> QualIdent l -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> QualIdent l -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l))
-> Data (QualIdent l)
QualIdent l -> DataType
QualIdent l -> Constr
(forall d. Data d => c (t d)) -> Maybe (c (QualIdent l))
(forall b. Data b => b -> b) -> QualIdent l -> QualIdent l
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> QualIdent l -> c (QualIdent l)
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (QualIdent l)
forall l. Data l => Typeable (QualIdent l)
forall l. Data l => QualIdent l -> DataType
forall l. Data l => QualIdent l -> Constr
forall l.
Data l =>
(forall b. Data b => b -> b) -> QualIdent l -> QualIdent l
forall l u.
Data l =>
Int -> (forall d. Data d => d -> u) -> QualIdent l -> u
forall l u.
Data l =>
(forall d. Data d => d -> u) -> QualIdent l -> [u]
forall l r r'.
Data l =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
forall l r r'.
Data l =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
forall l (m :: * -> *).
(Data l, Monad m) =>
(forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
forall l (m :: * -> *).
(Data l, MonadPlus m) =>
(forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
forall l (c :: * -> *).
Data l =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (QualIdent l)
forall l (c :: * -> *).
Data l =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> QualIdent l -> c (QualIdent l)
forall l (t :: * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (QualIdent l))
forall l (t :: * -> * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (QualIdent l))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> QualIdent l -> u
forall u. (forall d. Data d => d -> u) -> QualIdent l -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (QualIdent l)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> QualIdent l -> c (QualIdent l)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (QualIdent l))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (QualIdent l))
$cNonQualIdent :: Constr
$cQualIdent :: Constr
$tQualIdent :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
$cgmapMo :: forall l (m :: * -> *).
(Data l, MonadPlus m) =>
(forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
gmapMp :: (forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
$cgmapMp :: forall l (m :: * -> *).
(Data l, MonadPlus m) =>
(forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
gmapM :: (forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
$cgmapM :: forall l (m :: * -> *).
(Data l, Monad m) =>
(forall d. Data d => d -> m d) -> QualIdent l -> m (QualIdent l)
gmapQi :: Int -> (forall d. Data d => d -> u) -> QualIdent l -> u
$cgmapQi :: forall l u.
Data l =>
Int -> (forall d. Data d => d -> u) -> QualIdent l -> u
gmapQ :: (forall d. Data d => d -> u) -> QualIdent l -> [u]
$cgmapQ :: forall l u.
Data l =>
(forall d. Data d => d -> u) -> QualIdent l -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
$cgmapQr :: forall l r r'.
Data l =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
$cgmapQl :: forall l r r'.
Data l =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> QualIdent l -> r
gmapT :: (forall b. Data b => b -> b) -> QualIdent l -> QualIdent l
$cgmapT :: forall l.
Data l =>
(forall b. Data b => b -> b) -> QualIdent l -> QualIdent l
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (QualIdent l))
$cdataCast2 :: forall l (t :: * -> * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (QualIdent l))
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c (QualIdent l))
$cdataCast1 :: forall l (t :: * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (QualIdent l))
dataTypeOf :: QualIdent l -> DataType
$cdataTypeOf :: forall l. Data l => QualIdent l -> DataType
toConstr :: QualIdent l -> Constr
$ctoConstr :: forall l. Data l => QualIdent l -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (QualIdent l)
$cgunfold :: forall l (c :: * -> *).
Data l =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (QualIdent l)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> QualIdent l -> c (QualIdent l)
$cgfoldl :: forall l (c :: * -> *).
Data l =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> QualIdent l -> c (QualIdent l)
$cp1Data :: forall l. Data l => Typeable (QualIdent l)
Data, QualIdent l -> QualIdent l -> Bool
(QualIdent l -> QualIdent l -> Bool)
-> (QualIdent l -> QualIdent l -> Bool) -> Eq (QualIdent l)
forall l. QualIdent l -> QualIdent l -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: QualIdent l -> QualIdent l -> Bool
$c/= :: forall l. QualIdent l -> QualIdent l -> Bool
== :: QualIdent l -> QualIdent l -> Bool
$c== :: forall l. QualIdent l -> QualIdent l -> Bool
Eq, Eq (QualIdent l)
Eq (QualIdent l)
-> (QualIdent l -> QualIdent l -> Ordering)
-> (QualIdent l -> QualIdent l -> Bool)
-> (QualIdent l -> QualIdent l -> Bool)
-> (QualIdent l -> QualIdent l -> Bool)
-> (QualIdent l -> QualIdent l -> Bool)
-> (QualIdent l -> QualIdent l -> QualIdent l)
-> (QualIdent l -> QualIdent l -> QualIdent l)
-> Ord (QualIdent l)
QualIdent l -> QualIdent l -> Bool
QualIdent l -> QualIdent l -> Ordering
QualIdent l -> QualIdent l -> QualIdent l
forall l. Eq (QualIdent l)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall l. QualIdent l -> QualIdent l -> Bool
forall l. QualIdent l -> QualIdent l -> Ordering
forall l. QualIdent l -> QualIdent l -> QualIdent l
min :: QualIdent l -> QualIdent l -> QualIdent l
$cmin :: forall l. QualIdent l -> QualIdent l -> QualIdent l
max :: QualIdent l -> QualIdent l -> QualIdent l
$cmax :: forall l. QualIdent l -> QualIdent l -> QualIdent l
>= :: QualIdent l -> QualIdent l -> Bool
$c>= :: forall l. QualIdent l -> QualIdent l -> Bool
> :: QualIdent l -> QualIdent l -> Bool
$c> :: forall l. QualIdent l -> QualIdent l -> Bool
<= :: QualIdent l -> QualIdent l -> Bool
$c<= :: forall l. QualIdent l -> QualIdent l -> Bool
< :: QualIdent l -> QualIdent l -> Bool
$c< :: forall l. QualIdent l -> QualIdent l -> Bool
compare :: QualIdent l -> QualIdent l -> Ordering
$ccompare :: forall l. QualIdent l -> QualIdent l -> Ordering
$cp1Ord :: forall l. Eq (QualIdent l)
Ord, Int -> QualIdent l -> ShowS
[QualIdent l] -> ShowS
QualIdent l -> String
(Int -> QualIdent l -> ShowS)
-> (QualIdent l -> String)
-> ([QualIdent l] -> ShowS)
-> Show (QualIdent l)
forall l. Int -> QualIdent l -> ShowS
forall l. [QualIdent l] -> ShowS
forall l. QualIdent l -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [QualIdent l] -> ShowS
$cshowList :: forall l. [QualIdent l] -> ShowS
show :: QualIdent l -> String
$cshow :: forall l. QualIdent l -> String
showsPrec :: Int -> QualIdent l -> ShowS
$cshowsPrec :: forall l. Int -> QualIdent l -> ShowS
Show)

data IdentDef l = IdentDef Ident AccessMode
   deriving (Typeable (IdentDef l)
DataType
Constr
Typeable (IdentDef l)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> IdentDef l -> c (IdentDef l))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (IdentDef l))
-> (IdentDef l -> Constr)
-> (IdentDef l -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (IdentDef l)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (IdentDef l)))
-> ((forall b. Data b => b -> b) -> IdentDef l -> IdentDef l)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> IdentDef l -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> IdentDef l -> r)
-> (forall u. (forall d. Data d => d -> u) -> IdentDef l -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> IdentDef l -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l))
-> Data (IdentDef l)
IdentDef l -> DataType
IdentDef l -> Constr
(forall d. Data d => c (t d)) -> Maybe (c (IdentDef l))
(forall b. Data b => b -> b) -> IdentDef l -> IdentDef l
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> IdentDef l -> c (IdentDef l)
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (IdentDef l)
forall l. Data l => Typeable (IdentDef l)
forall l. Data l => IdentDef l -> DataType
forall l. Data l => IdentDef l -> Constr
forall l.
Data l =>
(forall b. Data b => b -> b) -> IdentDef l -> IdentDef l
forall l u.
Data l =>
Int -> (forall d. Data d => d -> u) -> IdentDef l -> u
forall l u.
Data l =>
(forall d. Data d => d -> u) -> IdentDef l -> [u]
forall l r r'.
Data l =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
forall l r r'.
Data l =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
forall l (m :: * -> *).
(Data l, Monad m) =>
(forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
forall l (m :: * -> *).
(Data l, MonadPlus m) =>
(forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
forall l (c :: * -> *).
Data l =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (IdentDef l)
forall l (c :: * -> *).
Data l =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> IdentDef l -> c (IdentDef l)
forall l (t :: * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (IdentDef l))
forall l (t :: * -> * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (IdentDef l))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> IdentDef l -> u
forall u. (forall d. Data d => d -> u) -> IdentDef l -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (IdentDef l)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> IdentDef l -> c (IdentDef l)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (IdentDef l))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (IdentDef l))
$cIdentDef :: Constr
$tIdentDef :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
$cgmapMo :: forall l (m :: * -> *).
(Data l, MonadPlus m) =>
(forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
gmapMp :: (forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
$cgmapMp :: forall l (m :: * -> *).
(Data l, MonadPlus m) =>
(forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
gmapM :: (forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
$cgmapM :: forall l (m :: * -> *).
(Data l, Monad m) =>
(forall d. Data d => d -> m d) -> IdentDef l -> m (IdentDef l)
gmapQi :: Int -> (forall d. Data d => d -> u) -> IdentDef l -> u
$cgmapQi :: forall l u.
Data l =>
Int -> (forall d. Data d => d -> u) -> IdentDef l -> u
gmapQ :: (forall d. Data d => d -> u) -> IdentDef l -> [u]
$cgmapQ :: forall l u.
Data l =>
(forall d. Data d => d -> u) -> IdentDef l -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
$cgmapQr :: forall l r r'.
Data l =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
$cgmapQl :: forall l r r'.
Data l =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> IdentDef l -> r
gmapT :: (forall b. Data b => b -> b) -> IdentDef l -> IdentDef l
$cgmapT :: forall l.
Data l =>
(forall b. Data b => b -> b) -> IdentDef l -> IdentDef l
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (IdentDef l))
$cdataCast2 :: forall l (t :: * -> * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (IdentDef l))
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c (IdentDef l))
$cdataCast1 :: forall l (t :: * -> *) (c :: * -> *).
(Data l, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (IdentDef l))
dataTypeOf :: IdentDef l -> DataType
$cdataTypeOf :: forall l. Data l => IdentDef l -> DataType
toConstr :: IdentDef l -> Constr
$ctoConstr :: forall l. Data l => IdentDef l -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (IdentDef l)
$cgunfold :: forall l (c :: * -> *).
Data l =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (IdentDef l)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> IdentDef l -> c (IdentDef l)
$cgfoldl :: forall l (c :: * -> *).
Data l =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> IdentDef l -> c (IdentDef l)
$cp1Data :: forall l. Data l => Typeable (IdentDef l)
Data, IdentDef l -> IdentDef l -> Bool
(IdentDef l -> IdentDef l -> Bool)
-> (IdentDef l -> IdentDef l -> Bool) -> Eq (IdentDef l)
forall l. IdentDef l -> IdentDef l -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IdentDef l -> IdentDef l -> Bool
$c/= :: forall l. IdentDef l -> IdentDef l -> Bool
== :: IdentDef l -> IdentDef l -> Bool
$c== :: forall l. IdentDef l -> IdentDef l -> Bool
Eq, Eq (IdentDef l)
Eq (IdentDef l)
-> (IdentDef l -> IdentDef l -> Ordering)
-> (IdentDef l -> IdentDef l -> Bool)
-> (IdentDef l -> IdentDef l -> Bool)
-> (IdentDef l -> IdentDef l -> Bool)
-> (IdentDef l -> IdentDef l -> Bool)
-> (IdentDef l -> IdentDef l -> IdentDef l)
-> (IdentDef l -> IdentDef l -> IdentDef l)
-> Ord (IdentDef l)
IdentDef l -> IdentDef l -> Bool
IdentDef l -> IdentDef l -> Ordering
IdentDef l -> IdentDef l -> IdentDef l
forall l. Eq (IdentDef l)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall l. IdentDef l -> IdentDef l -> Bool
forall l. IdentDef l -> IdentDef l -> Ordering
forall l. IdentDef l -> IdentDef l -> IdentDef l
min :: IdentDef l -> IdentDef l -> IdentDef l
$cmin :: forall l. IdentDef l -> IdentDef l -> IdentDef l
max :: IdentDef l -> IdentDef l -> IdentDef l
$cmax :: forall l. IdentDef l -> IdentDef l -> IdentDef l
>= :: IdentDef l -> IdentDef l -> Bool
$c>= :: forall l. IdentDef l -> IdentDef l -> Bool
> :: IdentDef l -> IdentDef l -> Bool
$c> :: forall l. IdentDef l -> IdentDef l -> Bool
<= :: IdentDef l -> IdentDef l -> Bool
$c<= :: forall l. IdentDef l -> IdentDef l -> Bool
< :: IdentDef l -> IdentDef l -> Bool
$c< :: forall l. IdentDef l -> IdentDef l -> Bool
compare :: IdentDef l -> IdentDef l -> Ordering
$ccompare :: forall l. IdentDef l -> IdentDef l -> Ordering
$cp1Ord :: forall l. Eq (IdentDef l)
Ord, Int -> IdentDef l -> ShowS
[IdentDef l] -> ShowS
IdentDef l -> String
(Int -> IdentDef l -> ShowS)
-> (IdentDef l -> String)
-> ([IdentDef l] -> ShowS)
-> Show (IdentDef l)
forall l. Int -> IdentDef l -> ShowS
forall l. [IdentDef l] -> ShowS
forall l. IdentDef l -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IdentDef l] -> ShowS
$cshowList :: forall l. [IdentDef l] -> ShowS
show :: IdentDef l -> String
$cshow :: forall l. IdentDef l -> String
showsPrec :: Int -> IdentDef l -> ShowS
$cshowsPrec :: forall l. Int -> IdentDef l -> ShowS
Show)

data AccessMode = Exported | ReadOnly | PrivateOnly
   deriving (Typeable AccessMode
DataType
Constr
Typeable AccessMode
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> AccessMode -> c AccessMode)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c AccessMode)
-> (AccessMode -> Constr)
-> (AccessMode -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c AccessMode))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c AccessMode))
-> ((forall b. Data b => b -> b) -> AccessMode -> AccessMode)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> AccessMode -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> AccessMode -> r)
-> (forall u. (forall d. Data d => d -> u) -> AccessMode -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> AccessMode -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> AccessMode -> m AccessMode)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> AccessMode -> m AccessMode)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> AccessMode -> m AccessMode)
-> Data AccessMode
AccessMode -> DataType
AccessMode -> Constr
(forall b. Data b => b -> b) -> AccessMode -> AccessMode
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> AccessMode -> c AccessMode
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c AccessMode
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> AccessMode -> u
forall u. (forall d. Data d => d -> u) -> AccessMode -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> AccessMode -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> AccessMode -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c AccessMode
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> AccessMode -> c AccessMode
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c AccessMode)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c AccessMode)
$cPrivateOnly :: Constr
$cReadOnly :: Constr
$cExported :: Constr
$tAccessMode :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
gmapMp :: (forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
gmapM :: (forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> AccessMode -> m AccessMode
gmapQi :: Int -> (forall d. Data d => d -> u) -> AccessMode -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> AccessMode -> u
gmapQ :: (forall d. Data d => d -> u) -> AccessMode -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> AccessMode -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> AccessMode -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> AccessMode -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> AccessMode -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> AccessMode -> r
gmapT :: (forall b. Data b => b -> b) -> AccessMode -> AccessMode
$cgmapT :: (forall b. Data b => b -> b) -> AccessMode -> AccessMode
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c AccessMode)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c AccessMode)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c AccessMode)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c AccessMode)
dataTypeOf :: AccessMode -> DataType
$cdataTypeOf :: AccessMode -> DataType
toConstr :: AccessMode -> Constr
$ctoConstr :: AccessMode -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c AccessMode
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c AccessMode
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> AccessMode -> c AccessMode
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> AccessMode -> c AccessMode
$cp1Data :: Typeable AccessMode
Data, AccessMode -> AccessMode -> Bool
(AccessMode -> AccessMode -> Bool)
-> (AccessMode -> AccessMode -> Bool) -> Eq AccessMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AccessMode -> AccessMode -> Bool
$c/= :: AccessMode -> AccessMode -> Bool
== :: AccessMode -> AccessMode -> Bool
$c== :: AccessMode -> AccessMode -> Bool
Eq, Eq AccessMode
Eq AccessMode
-> (AccessMode -> AccessMode -> Ordering)
-> (AccessMode -> AccessMode -> Bool)
-> (AccessMode -> AccessMode -> Bool)
-> (AccessMode -> AccessMode -> Bool)
-> (AccessMode -> AccessMode -> Bool)
-> (AccessMode -> AccessMode -> AccessMode)
-> (AccessMode -> AccessMode -> AccessMode)
-> Ord AccessMode
AccessMode -> AccessMode -> Bool
AccessMode -> AccessMode -> Ordering
AccessMode -> AccessMode -> AccessMode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AccessMode -> AccessMode -> AccessMode
$cmin :: AccessMode -> AccessMode -> AccessMode
max :: AccessMode -> AccessMode -> AccessMode
$cmax :: AccessMode -> AccessMode -> AccessMode
>= :: AccessMode -> AccessMode -> Bool
$c>= :: AccessMode -> AccessMode -> Bool
> :: AccessMode -> AccessMode -> Bool
$c> :: AccessMode -> AccessMode -> Bool
<= :: AccessMode -> AccessMode -> Bool
$c<= :: AccessMode -> AccessMode -> Bool
< :: AccessMode -> AccessMode -> Bool
$c< :: AccessMode -> AccessMode -> Bool
compare :: AccessMode -> AccessMode -> Ordering
$ccompare :: AccessMode -> AccessMode -> Ordering
$cp1Ord :: Eq AccessMode
Ord, Int -> AccessMode -> ShowS
[AccessMode] -> ShowS
AccessMode -> String
(Int -> AccessMode -> ShowS)
-> (AccessMode -> String)
-> ([AccessMode] -> ShowS)
-> Show AccessMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AccessMode] -> ShowS
$cshowList :: [AccessMode] -> ShowS
show :: AccessMode -> String
$cshow :: AccessMode -> String
showsPrec :: Int -> AccessMode -> ShowS
$cshowsPrec :: Int -> AccessMode -> ShowS
Show)

data Expression λ l f' f = Relation RelOp (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | IsA (f (Abstract.Expression l l f' f')) (Abstract.QualIdent l)
                         | Positive (f (Abstract.Expression l l f' f'))
                         | Negative (f (Abstract.Expression l l f' f'))
                         | Add (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | Subtract (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | Or (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | Multiply (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | Divide (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | IntegerDivide (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | Modulo (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | And (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))
                         | Set (ZipList (f (Abstract.Element l l f' f')))
                         | Read (f (Abstract.Designator l l f' f'))
                         | FunctionCall (f (Abstract.Designator l l f' f')) (ZipList (f (Abstract.Expression l l f' f')))
                         | Not (f (Abstract.Expression l l f' f'))
                         | Literal (f (Abstract.Value l l f' f'))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
                   Data (Abstract.QualIdent l), Data (f (Abstract.Value l l f' f')),
                   Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.Element l l f' f')),
                   Data (f (Abstract.Expression l l f' f'))) =>
                  Data (Expression λ l f' f)
deriving instance (Show (Abstract.QualIdent l), Show (f (Abstract.Value l l f' f')), Show (f (Abstract.Designator l l f' f')),
                   Show (f (Abstract.Element l l f' f')), Show (f (Abstract.Expression l l f' f'))) =>
                  Show (Expression λ l f' f)
deriving instance (Eq (Abstract.QualIdent l), Eq (f (Abstract.Value l l f' f')),
                   Eq (f (Abstract.Designator l l f' f')), Eq (f (Abstract.Element l l f' f')),
                   Eq (f (Abstract.Expression l l f' f'))) => Eq (Expression λ l f' f)

data Element λ l f' f = Element (f (Abstract.Expression l l f' f'))
                      | Range (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f'))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.Expression l l f' f'))) =>
                  Data (Element λ l f' f)
deriving instance Show (f (Abstract.Expression l l f' f')) => Show (Element λ l f' f)
deriving instance Eq (f (Abstract.Expression l l f' f')) => Eq (Element λ l f' f)

data Value λ l (f' :: * -> *) (f :: * -> *) = Boolean Bool
                                            | Builtin Text
                                            | CharCode Int
                                            | Integer Integer
                                            | Nil
                                            | Real Double
                                            | String Text
                                            deriving (Value λ l f' f -> Value λ l f' f -> Bool
(Value λ l f' f -> Value λ l f' f -> Bool)
-> (Value λ l f' f -> Value λ l f' f -> Bool)
-> Eq (Value λ l f' f)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall λ l (f' :: * -> *) (f :: * -> *).
Value λ l f' f -> Value λ l f' f -> Bool
/= :: Value λ l f' f -> Value λ l f' f -> Bool
$c/= :: forall λ l (f' :: * -> *) (f :: * -> *).
Value λ l f' f -> Value λ l f' f -> Bool
== :: Value λ l f' f -> Value λ l f' f -> Bool
$c== :: forall λ l (f' :: * -> *) (f :: * -> *).
Value λ l f' f -> Value λ l f' f -> Bool
Eq, Int -> Value λ l f' f -> ShowS
[Value λ l f' f] -> ShowS
Value λ l f' f -> String
(Int -> Value λ l f' f -> ShowS)
-> (Value λ l f' f -> String)
-> ([Value λ l f' f] -> ShowS)
-> Show (Value λ l f' f)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall λ l (f' :: * -> *) (f :: * -> *).
Int -> Value λ l f' f -> ShowS
forall λ l (f' :: * -> *) (f :: * -> *). [Value λ l f' f] -> ShowS
forall λ l (f' :: * -> *) (f :: * -> *). Value λ l f' f -> String
showList :: [Value λ l f' f] -> ShowS
$cshowList :: forall λ l (f' :: * -> *) (f :: * -> *). [Value λ l f' f] -> ShowS
show :: Value λ l f' f -> String
$cshow :: forall λ l (f' :: * -> *) (f :: * -> *). Value λ l f' f -> String
showsPrec :: Int -> Value λ l f' f -> ShowS
$cshowsPrec :: forall λ l (f' :: * -> *) (f :: * -> *).
Int -> Value λ l f' f -> ShowS
Show)

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f') => Data (Value λ l f' f)

data Designator λ l f' f = Variable (Abstract.QualIdent l)
                         | Field (f (Abstract.Designator l l f' f')) Ident 
                         | Index (f (Abstract.Designator l l f' f'))
                                 (f (Abstract.Expression l l f' f')) (ZipList (f (Abstract.Expression l l f' f')))
                         | TypeGuard (f (Abstract.Designator l l f' f')) (Abstract.QualIdent l)
                         | Dereference (f (Abstract.Designator l l f' f'))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.QualIdent l),
                   Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.Expression l l f' f'))) =>
                  Data (Designator λ l f' f)
deriving instance (Show (Abstract.QualIdent l), Show (f (Abstract.Designator l l f' f')),
                   Show (f (Abstract.Expression l l f' f'))) => Show (Designator λ l f' f)
deriving instance (Eq (Abstract.QualIdent l), Eq (f (Abstract.Designator l l f' f')),
                   Eq (f (Abstract.Expression l l f' f'))) => Eq (Designator λ l f' f)

data Type λ l f' f = TypeReference (Abstract.QualIdent l)
                   | ArrayType (ZipList (f (Abstract.ConstExpression l l f' f'))) (f (Abstract.Type l l f' f'))
                   | RecordType (Maybe (Abstract.BaseType l)) (ZipList (f (Abstract.FieldList l l f' f')))
                   | PointerType (f (Abstract.Type l l f' f'))
                   | ProcedureType (Maybe (f (Abstract.FormalParameters l l f' f')))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.QualIdent l), Data (f (Abstract.Type l l f' f')),
                   Data (f (Abstract.ConstExpression l l f' f')), Data (f (Abstract.FormalParameters l l f' f')),
                   Data (f (Abstract.FieldList l l f' f'))) =>
                  Data (Type λ l f' f)
deriving instance (Show (Abstract.QualIdent l), Show (f (Abstract.Type l l f' f')),
                   Show (f (Abstract.ConstExpression l l f' f')), Show (f (Abstract.FormalParameters l l f' f')),
                   Show (f (Abstract.FieldList l l f' f'))) =>
                  Show (Type λ l f' f)

data FieldList λ l f' f = FieldList (Abstract.IdentList l) (f (Abstract.Type l l f' f'))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.IdentDef l), Data (f (Abstract.Type l l f' f')),
                   Data (f (Abstract.Expression l l f' f'))) => Data (FieldList λ l f' f)
deriving instance (Show (Abstract.IdentDef l), Show (f (Abstract.Type l l f' f')), Show (f (Abstract.Expression l l f' f'))) =>
                  Show (FieldList λ l f' f)

data ProcedureHeading λ l f' f =
   ProcedureHeading                    Bool (Abstract.IdentDef l) (Maybe (f (Abstract.FormalParameters l l f' f')))
   | TypeBoundHeading Bool Ident Ident Bool (Abstract.IdentDef l) (Maybe (f (Abstract.FormalParameters l l f' f')))

data FormalParameters λ l f' f = FormalParameters (ZipList (f (Abstract.FPSection l l f' f'))) (Maybe (Abstract.ReturnType l))

data FPSection λ l f' f = FPSection Bool [Ident] (f (Abstract.Type l l f' f'))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.IdentDef l),
                   Data (f (Abstract.FormalParameters l l f' f'))) => Data (ProcedureHeading λ l f' f)
deriving instance (Show (Abstract.IdentDef l), Show (f (Abstract.FormalParameters l l f' f'))) =>
                  Show (ProcedureHeading λ l f' f)

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.ReturnType l),
                   Data (f (Abstract.FPSection l l f' f')),  Data (f (Abstract.Expression l l f' f'))) =>
                  Data (FormalParameters λ l f' f)
deriving instance (Show (f (Abstract.FPSection l l f' f')), Show (Abstract.ReturnType l),
                   Show (f (Abstract.Expression l l f' f'))) => Show (FormalParameters λ l f' f)

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.Type l l f' f')),
                   Data (f (Abstract.Expression l l f' f'))) => Data (FPSection λ l f' f)
deriving instance (Show (f (Abstract.Type l l f' f')), Show (f (Abstract.Expression l l f' f'))) => Show (FPSection λ l f' f)

data Block λ l f' f = Block (ZipList (f (Abstract.Declaration l l f' f'))) (Maybe (f (Abstract.StatementSequence l l f' f')))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.Declaration l l f' f')),
                   Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.Expression l l f' f')),
                   Data (f (Abstract.StatementSequence l l f' f'))) =>
                  Data (Block λ l f' f)
deriving instance (Show (f (Abstract.Declaration l l f' f')), Show (f (Abstract.Designator l l f' f')),
                   Show (f (Abstract.Expression l l f' f')), Show (f (Abstract.StatementSequence l l f' f'))) =>
                  Show (Block λ l f' f)

newtype StatementSequence λ l f' f = StatementSequence (ZipList (f (Abstract.Statement l l f' f')))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.Statement l l f' f'))) =>
                  Data (StatementSequence λ l f' f)
deriving instance Show (f (Abstract.Statement l l f' f')) => Show (StatementSequence λ l f' f)

data Statement λ l f' f = EmptyStatement
                        | Assignment (f (Abstract.Designator l l f' f')) (f (Abstract.Expression l l f' f'))
                        | ProcedureCall (f (Abstract.Designator l l f' f')) (Maybe (ZipList (f (Abstract.Expression l l f' f'))))
                        | If (f (Abstract.ConditionalBranch l l f' f'))
                             (ZipList (f (Abstract.ConditionalBranch l l f' f')))
                             (Maybe (f (Abstract.StatementSequence l l f' f')))
                        | CaseStatement (f (Abstract.Expression l l f' f')) 
                                        (ZipList (f (Abstract.Case l l f' f')))
                                        (Maybe (f (Abstract.StatementSequence l l f' f')))
                        | While (f (Abstract.Expression l l f' f')) (f (Abstract.StatementSequence l l f' f'))
                        | Repeat (f (Abstract.StatementSequence l l f' f')) (f (Abstract.Expression l l f' f'))
                        | For Ident (f (Abstract.Expression l l f' f')) (f (Abstract.Expression l l f' f')) 
                              (Maybe (f (Abstract.Expression l l f' f'))) (f (Abstract.StatementSequence l l f' f'))  -- Oberon2
                        | Loop (f (Abstract.StatementSequence l l f' f'))
                        | With (f (Abstract.WithAlternative l l f' f'))
                               (ZipList (f (Abstract.WithAlternative l l f' f')))
                               (Maybe (f (Abstract.StatementSequence l l f' f')))
                        | Exit
                        | Return (Maybe (f (Abstract.Expression l l f' f')))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
                   Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.Expression l l f' f')),
                   Data (f (Abstract.Case l l f' f')), Data (f (Abstract.WithAlternative l l f' f')),
                   Data (f (Abstract.ConditionalBranch l l f' f')),
                   Data (f (Abstract.StatementSequence l l f' f'))) => Data (Statement λ l f' f)
deriving instance (Show (f (Abstract.Designator l l f' f')), Show (f (Abstract.Expression l l f' f')),
                   Show (f (Abstract.Case l l f' f')), Show (f (Abstract.WithAlternative l l f' f')),
                   Show (f (Abstract.ConditionalBranch l l f' f')),
                   Show (f (Abstract.StatementSequence l l f' f'))) => Show (Statement λ l f' f)

data WithAlternative λ l f' f = WithAlternative (Abstract.QualIdent l) (Abstract.QualIdent l)
                                                (f (Abstract.StatementSequence l l f' f'))

data Case λ l f' f = Case (f (Abstract.CaseLabels l l f' f')) (ZipList (f (Abstract.CaseLabels l l f' f')))
                          (f (Abstract.StatementSequence l l f' f'))

data CaseLabels λ l f' f = SingleLabel (f (Abstract.ConstExpression l l f' f'))
                         | LabelRange (f (Abstract.ConstExpression l l f' f')) (f (Abstract.ConstExpression l l f' f'))

data ConditionalBranch λ l f' f =
   ConditionalBranch (f (Abstract.Expression l l f' f')) (f (Abstract.StatementSequence l l f' f'))

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (Abstract.QualIdent l),
                   Data (f (Abstract.Designator l l f' f')), Data (f (Abstract.StatementSequence l l f' f'))) =>
                  Data (WithAlternative λ l f' f)
deriving instance (Show (Abstract.QualIdent l), Show (f (Abstract.StatementSequence l l f' f'))) =>
                  Show (WithAlternative λ l f' f)

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
                   Data (f (Abstract.CaseLabels l l f' f')), Data (f (Abstract.StatementSequence l l f' f'))) =>
                  Data (Case λ l f' f)
deriving instance (Show (f (Abstract.CaseLabels l l f' f')), Show (f (Abstract.StatementSequence l l f' f'))) =>
                  Show (Case λ l f' f)

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f',
                   Data (f (Abstract.Expression l l f' f')), Data (f (Abstract.StatementSequence l l f' f'))) =>
                  Data (ConditionalBranch λ l f' f)
deriving instance (Show (f (Abstract.Expression l l f' f')), Show (f (Abstract.StatementSequence l l f' f'))) =>
                  Show (ConditionalBranch λ l f' f)

deriving instance (Typeable λ, Typeable l, Typeable f, Typeable f', Data (f (Abstract.ConstExpression l l f' f'))) =>
                  Data (CaseLabels λ l f' f)
deriving instance Show (f (Abstract.ConstExpression l l f' f')) => Show (CaseLabels λ l f' f)

$(concat <$>
  (forM [Rank2.TH.deriveFunctor, Rank2.TH.deriveFoldable, Rank2.TH.deriveTraversable,
         Transformation.Shallow.TH.deriveAll, Transformation.Deep.TH.deriveAll] $
   \derive-> mconcat <$> mapM derive
             [''Module, ''Declaration, ''Type, ''Expression, ''Value,
              ''Element, ''Designator, ''FieldList,
              ''ProcedureHeading, ''FormalParameters, ''FPSection, ''Block,
              ''Statement, ''StatementSequence,
              ''Case, ''CaseLabels, ''ConditionalBranch, ''WithAlternative]))

$(mconcat <$> mapM Rank2.TH.unsafeDeriveApply
  [''Declaration, ''Type, ''Expression, ''Value,
   ''Element, ''Designator, ''FieldList,
   ''ProcedureHeading, ''FormalParameters, ''FPSection, ''Block,
   ''Statement, ''StatementSequence,
   ''Case, ''CaseLabels, ''ConditionalBranch, ''WithAlternative])