{-# LANGUAGE DeriveDataTypeable, KindSignatures, PolyKinds, ScopedTypeVariables,
             TypeApplications, TypeFamilies, TypeFamilyDependencies, UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-}

-- | Finally Tagless Abstract Syntax Tree definitions for the programming language Modula-2

module Language.Modula2.Abstract (Ident, IdentList, BaseType, ConstExpression, Priority,
                                  Wirthy(..), CoWirthy(..), Nameable(..), Modula2(..),
                                  RelOp(..), WirthySubsetOf(..), Maybe3(..), just3, maybe3, nothing3) where

import Data.Data (Data, Typeable)
import Data.List.NonEmpty
import Data.Text (Text)

import Language.Oberon.Abstract

-- | Module priority
type Priority l = ConstExpression l

-- | The finally-tagless associated types and methods relevant to the Modula-2 language. Every non-leaf node type has
-- four type variables:
--
-- * type variable @l@ represents the language of the constructs built by the methods,
-- * @l'@ is the language of the child node constructs,
-- * @f'@ wraps all descendant nodes, except
-- * @f@ wraps all direct children of the node.
class Wirthy l => Modula2 l where
   type Export l = x | x -> l
   type Definition l = (d :: * -> (* -> *) -> (* -> *) -> *) | d -> l
   type Variant l = (v :: * -> (* -> *) -> (* -> *) -> *) | v -> l

   -- Module
   definitionModule :: Ident -> [Import l'] -> Maybe (Export l') -> [f (Definition l' l' f' f')] -> Module l l' f' f
   implementationModule,
      programModule :: Ident -> Maybe (f (Priority l' l' f' f')) -> [Import l'] -> f (Block l' l' f' f')
                    -> Module l l' f' f

   moduleExport :: Bool -> NonEmpty Ident -> Export l
   moduleImport :: Maybe Ident -> NonEmpty Ident -> Import l

   -- Definition
   constantDefinition :: IdentDef l' -> f (ConstExpression l' l' f' f') -> Definition l l' f' f
   typeDefinition :: IdentDef l' -> Maybe (f (Type l' l' f' f')) -> Definition l l' f' f
   variableDefinition :: IdentList l' -> f (Type l' l' f' f') -> Definition l l' f' f
   procedureDefinition :: f (ProcedureHeading l' l' f' f') -> Definition l l' f' f

   -- Declaration
   moduleDeclaration :: Ident -> Maybe (f (Priority l' l' f' f'))
                     -> [Import l'] -> Maybe (Export l') -> f (Block l' l' f' f') -> Declaration l l' f' f

   procedureHeading :: Ident -> Maybe (f (FormalParameters l' l' f' f')) -> ProcedureHeading l l' f' f
   caseFieldList :: Maybe Ident -> QualIdent l' -> NonEmpty (f (Variant l' l' f' f')) -> [f (FieldList l' l' f' f')]
                 -> FieldList l l' f' f
   variant :: NonEmpty (f (CaseLabels l' l' f' f')) -> [f (FieldList l' l' f' f')] -> Variant l l' f' f

   -- Type
   enumeration :: IdentList l' -> Type l l' f' f
   subRange :: Maybe (QualIdent l') -> f (ConstExpression l' l' f' f') -> f (ConstExpression l' l' f' f')
            -> Type l l' f' f
   arrayType :: [f (Type l' l' f' f')] -> f (Type l' l' f' f') -> Type l l' f' f
   setType :: f (Type l' l' f' f') -> Type l l' f' f
   recordType :: [f (FieldList l' l' f' f')] -> Type l l' f' f

   -- Statement
   withStatement :: f (Designator l' l' f' f') -> f (StatementSequence l' l' f' f') -> Statement l 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 l l' f' f

   -- Expression
   set :: Maybe (QualIdent l') -> [f (Element l' l' f' f')] -> Expression l l' f' f
   qualIdent :: [Ident] -> Ident -> QualIdent l

instance Wirthy l => Modula2 (WirthySubsetOf l) where
   type Export (WirthySubsetOf l) = Maybe (Export l)
   type Definition (WirthySubsetOf l) = Maybe3 (Definition l)
   type Variant (WirthySubsetOf l) = Maybe3 (Variant l)
   definitionModule :: Ident
-> [Import l']
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Module (WirthySubsetOf l) l' f' f
definitionModule = ([Import l']
 -> Maybe (Export l')
 -> [f (Definition l' l' f' f')]
 -> Maybe3 (Module l) l' f' f)
-> Ident
-> [Import l']
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const (([Import l']
  -> Maybe (Export l')
  -> [f (Definition l' l' f' f')]
  -> Maybe3 (Module l) l' f' f)
 -> Ident
 -> [Import l']
 -> Maybe (Export l')
 -> [f (Definition l' l' f' f')]
 -> Maybe3 (Module l) l' f' f)
-> ([Import l']
    -> Maybe (Export l')
    -> [f (Definition l' l' f' f')]
    -> Maybe3 (Module l) l' f' f)
-> Ident
-> [Import l']
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ (Maybe (Export l')
 -> [f (Definition l' l' f' f')] -> Maybe3 (Module l) l' f' f)
-> [Import l']
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const ((Maybe (Export l')
  -> [f (Definition l' l' f' f')] -> Maybe3 (Module l) l' f' f)
 -> [Import l']
 -> Maybe (Export l')
 -> [f (Definition l' l' f' f')]
 -> Maybe3 (Module l) l' f' f)
-> (Maybe (Export l')
    -> [f (Definition l' l' f' f')] -> Maybe3 (Module l) l' f' f)
-> [Import l']
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ ([f (Definition l' l' f' f')] -> Maybe3 (Module l) l' f' f)
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const (([f (Definition l' l' f' f')] -> Maybe3 (Module l) l' f' f)
 -> Maybe (Export l')
 -> [f (Definition l' l' f' f')]
 -> Maybe3 (Module l) l' f' f)
-> ([f (Definition l' l' f' f')] -> Maybe3 (Module l) l' f' f)
-> Maybe (Export l')
-> [f (Definition l' l' f' f')]
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Module l) l' f' f
-> [f (Definition l' l' f' f')] -> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Module l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   implementationModule :: Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Module (WirthySubsetOf l) l' f' f
implementationModule = (Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const ((Maybe (f (Priority l' l' f' f'))
  -> [Import l']
  -> f (Block l' l' f' f')
  -> Maybe3 (Module l) l' f' f)
 -> Ident
 -> Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> (Maybe (f (Priority l' l' f' f'))
    -> [Import l']
    -> f (Block l' l' f' f')
    -> Maybe3 (Module l) l' f' f)
-> Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ ([Import l'] -> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const (([Import l']
  -> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
 -> Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> ([Import l']
    -> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ (f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const ((f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> (f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Module l) l' f' f
-> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Module l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   programModule :: Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Module (WirthySubsetOf l) l' f' f
programModule = (Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const ((Maybe (f (Priority l' l' f' f'))
  -> [Import l']
  -> f (Block l' l' f' f')
  -> Maybe3 (Module l) l' f' f)
 -> Ident
 -> Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> (Maybe (f (Priority l' l' f' f'))
    -> [Import l']
    -> f (Block l' l' f' f')
    -> Maybe3 (Module l) l' f' f)
-> Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ ([Import l'] -> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const (([Import l']
  -> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
 -> Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> ([Import l']
    -> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ (f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const ((f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
 -> [Import l']
 -> f (Block l' l' f' f')
 -> Maybe3 (Module l) l' f' f)
-> (f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f)
-> [Import l']
-> f (Block l' l' f' f')
-> Maybe3 (Module l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Module l) l' f' f
-> f (Block l' l' f' f') -> Maybe3 (Module l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Module l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3

   moduleExport :: Bool -> NonEmpty Ident -> Export (WirthySubsetOf l)
moduleExport = (NonEmpty Ident -> Maybe (Export l))
-> Bool -> NonEmpty Ident -> Maybe (Export l)
forall a b. a -> b -> a
const ((NonEmpty Ident -> Maybe (Export l))
 -> Bool -> NonEmpty Ident -> Maybe (Export l))
-> (NonEmpty Ident -> Maybe (Export l))
-> Bool
-> NonEmpty Ident
-> Maybe (Export l)
forall a b. (a -> b) -> a -> b
$ Maybe (Export l) -> NonEmpty Ident -> Maybe (Export l)
forall a b. a -> b -> a
const Maybe (Export l)
forall a. Maybe a
Nothing
   moduleImport :: Maybe Ident -> NonEmpty Ident -> Import (WirthySubsetOf l)
moduleImport = (NonEmpty Ident -> Maybe (Import l))
-> Maybe Ident -> NonEmpty Ident -> Maybe (Import l)
forall a b. a -> b -> a
const ((NonEmpty Ident -> Maybe (Import l))
 -> Maybe Ident -> NonEmpty Ident -> Maybe (Import l))
-> (NonEmpty Ident -> Maybe (Import l))
-> Maybe Ident
-> NonEmpty Ident
-> Maybe (Import l)
forall a b. (a -> b) -> a -> b
$ Maybe (Import l) -> NonEmpty Ident -> Maybe (Import l)
forall a b. a -> b -> a
const Maybe (Import l)
forall a. Maybe a
Nothing

   -- Definition
   constantDefinition :: IdentDef l'
-> f (ConstExpression l' l' f' f')
-> Definition (WirthySubsetOf l) l' f' f
constantDefinition = (f (ConstExpression l' l' f' f') -> Maybe3 (Definition l) l' f' f)
-> IdentDef l'
-> f (ConstExpression l' l' f' f')
-> Maybe3 (Definition l) l' f' f
forall a b. a -> b -> a
const ((f (ConstExpression l' l' f' f') -> Maybe3 (Definition l) l' f' f)
 -> IdentDef l'
 -> f (ConstExpression l' l' f' f')
 -> Maybe3 (Definition l) l' f' f)
-> (f (ConstExpression l' l' f' f')
    -> Maybe3 (Definition l) l' f' f)
-> IdentDef l'
-> f (ConstExpression l' l' f' f')
-> Maybe3 (Definition l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Definition l) l' f' f
-> f (ConstExpression l' l' f' f') -> Maybe3 (Definition l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Definition l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   typeDefinition :: IdentDef l'
-> Maybe (f (Type l' l' f' f'))
-> Definition (WirthySubsetOf l) l' f' f
typeDefinition = (Maybe (f (Type l' l' f' f')) -> Maybe3 (Definition l) l' f' f)
-> IdentDef l'
-> Maybe (f (Type l' l' f' f'))
-> Maybe3 (Definition l) l' f' f
forall a b. a -> b -> a
const ((Maybe (f (Type l' l' f' f')) -> Maybe3 (Definition l) l' f' f)
 -> IdentDef l'
 -> Maybe (f (Type l' l' f' f'))
 -> Maybe3 (Definition l) l' f' f)
-> (Maybe (f (Type l' l' f' f')) -> Maybe3 (Definition l) l' f' f)
-> IdentDef l'
-> Maybe (f (Type l' l' f' f'))
-> Maybe3 (Definition l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Definition l) l' f' f
-> Maybe (f (Type l' l' f' f')) -> Maybe3 (Definition l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Definition l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   variableDefinition :: IdentList l'
-> f (Type l' l' f' f') -> Definition (WirthySubsetOf l) l' f' f
variableDefinition = (f (Type l' l' f' f') -> Maybe3 (Definition l) l' f' f)
-> IdentList l'
-> f (Type l' l' f' f')
-> Maybe3 (Definition l) l' f' f
forall a b. a -> b -> a
const ((f (Type l' l' f' f') -> Maybe3 (Definition l) l' f' f)
 -> IdentList l'
 -> f (Type l' l' f' f')
 -> Maybe3 (Definition l) l' f' f)
-> (f (Type l' l' f' f') -> Maybe3 (Definition l) l' f' f)
-> IdentList l'
-> f (Type l' l' f' f')
-> Maybe3 (Definition l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Definition l) l' f' f
-> f (Type l' l' f' f') -> Maybe3 (Definition l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Definition l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   procedureDefinition :: f (ProcedureHeading l' l' f' f')
-> Definition (WirthySubsetOf l) l' f' f
procedureDefinition = Maybe3 (Definition l) l' f' f
-> f (ProcedureHeading l' l' f' f')
-> Maybe3 (Definition l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Definition l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3

   -- Declaration
   moduleDeclaration :: Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Declaration (WirthySubsetOf l) l' f' f
moduleDeclaration = (Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> Maybe (Export l')
 -> f (Block l' l' f' f')
 -> Maybe3 (Declaration l) l' f' f)
-> Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. a -> b -> a
const ((Maybe (f (Priority l' l' f' f'))
  -> [Import l']
  -> Maybe (Export l')
  -> f (Block l' l' f' f')
  -> Maybe3 (Declaration l) l' f' f)
 -> Ident
 -> Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> Maybe (Export l')
 -> f (Block l' l' f' f')
 -> Maybe3 (Declaration l) l' f' f)
-> (Maybe (f (Priority l' l' f' f'))
    -> [Import l']
    -> Maybe (Export l')
    -> f (Block l' l' f' f')
    -> Maybe3 (Declaration l) l' f' f)
-> Ident
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. (a -> b) -> a -> b
$ ([Import l']
 -> Maybe (Export l')
 -> f (Block l' l' f' f')
 -> Maybe3 (Declaration l) l' f' f)
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. a -> b -> a
const (([Import l']
  -> Maybe (Export l')
  -> f (Block l' l' f' f')
  -> Maybe3 (Declaration l) l' f' f)
 -> Maybe (f (Priority l' l' f' f'))
 -> [Import l']
 -> Maybe (Export l')
 -> f (Block l' l' f' f')
 -> Maybe3 (Declaration l) l' f' f)
-> ([Import l']
    -> Maybe (Export l')
    -> f (Block l' l' f' f')
    -> Maybe3 (Declaration l) l' f' f)
-> Maybe (f (Priority l' l' f' f'))
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. (a -> b) -> a -> b
$ (Maybe (Export l')
 -> f (Block l' l' f' f') -> Maybe3 (Declaration l) l' f' f)
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. a -> b -> a
const ((Maybe (Export l')
  -> f (Block l' l' f' f') -> Maybe3 (Declaration l) l' f' f)
 -> [Import l']
 -> Maybe (Export l')
 -> f (Block l' l' f' f')
 -> Maybe3 (Declaration l) l' f' f)
-> (Maybe (Export l')
    -> f (Block l' l' f' f') -> Maybe3 (Declaration l) l' f' f)
-> [Import l']
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. (a -> b) -> a -> b
$ (f (Block l' l' f' f') -> Maybe3 (Declaration l) l' f' f)
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. a -> b -> a
const ((f (Block l' l' f' f') -> Maybe3 (Declaration l) l' f' f)
 -> Maybe (Export l')
 -> f (Block l' l' f' f')
 -> Maybe3 (Declaration l) l' f' f)
-> (f (Block l' l' f' f') -> Maybe3 (Declaration l) l' f' f)
-> Maybe (Export l')
-> f (Block l' l' f' f')
-> Maybe3 (Declaration l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Declaration l) l' f' f
-> f (Block l' l' f' f') -> Maybe3 (Declaration l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Declaration l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3

   procedureHeading :: Ident
-> Maybe (f (FormalParameters l' l' f' f'))
-> ProcedureHeading (WirthySubsetOf l) l' f' f
procedureHeading = (Maybe (f (FormalParameters l' l' f' f'))
 -> Maybe3 (ProcedureHeading l) l' f' f)
-> Ident
-> Maybe (f (FormalParameters l' l' f' f'))
-> Maybe3 (ProcedureHeading l) l' f' f
forall a b. a -> b -> a
const ((Maybe (f (FormalParameters l' l' f' f'))
  -> Maybe3 (ProcedureHeading l) l' f' f)
 -> Ident
 -> Maybe (f (FormalParameters l' l' f' f'))
 -> Maybe3 (ProcedureHeading l) l' f' f)
-> (Maybe (f (FormalParameters l' l' f' f'))
    -> Maybe3 (ProcedureHeading l) l' f' f)
-> Ident
-> Maybe (f (FormalParameters l' l' f' f'))
-> Maybe3 (ProcedureHeading l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (ProcedureHeading l) l' f' f
-> Maybe (f (FormalParameters l' l' f' f'))
-> Maybe3 (ProcedureHeading l) l' f' f
forall a b. a -> b -> a
const Maybe3 (ProcedureHeading l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   caseFieldList :: Maybe Ident
-> QualIdent l'
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> FieldList (WirthySubsetOf l) l' f' f
caseFieldList = (QualIdent l'
 -> NonEmpty (f (Variant l' l' f' f'))
 -> [f (FieldList l' l' f' f')]
 -> Maybe3 (FieldList l) l' f' f)
-> Maybe Ident
-> QualIdent l'
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (FieldList l) l' f' f
forall a b. a -> b -> a
const ((QualIdent l'
  -> NonEmpty (f (Variant l' l' f' f'))
  -> [f (FieldList l' l' f' f')]
  -> Maybe3 (FieldList l) l' f' f)
 -> Maybe Ident
 -> QualIdent l'
 -> NonEmpty (f (Variant l' l' f' f'))
 -> [f (FieldList l' l' f' f')]
 -> Maybe3 (FieldList l) l' f' f)
-> (QualIdent l'
    -> NonEmpty (f (Variant l' l' f' f'))
    -> [f (FieldList l' l' f' f')]
    -> Maybe3 (FieldList l) l' f' f)
-> Maybe Ident
-> QualIdent l'
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (FieldList l) l' f' f
forall a b. (a -> b) -> a -> b
$ (NonEmpty (f (Variant l' l' f' f'))
 -> [f (FieldList l' l' f' f')] -> Maybe3 (FieldList l) l' f' f)
-> QualIdent l'
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (FieldList l) l' f' f
forall a b. a -> b -> a
const ((NonEmpty (f (Variant l' l' f' f'))
  -> [f (FieldList l' l' f' f')] -> Maybe3 (FieldList l) l' f' f)
 -> QualIdent l'
 -> NonEmpty (f (Variant l' l' f' f'))
 -> [f (FieldList l' l' f' f')]
 -> Maybe3 (FieldList l) l' f' f)
-> (NonEmpty (f (Variant l' l' f' f'))
    -> [f (FieldList l' l' f' f')] -> Maybe3 (FieldList l) l' f' f)
-> QualIdent l'
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (FieldList l) l' f' f
forall a b. (a -> b) -> a -> b
$ ([f (FieldList l' l' f' f')] -> Maybe3 (FieldList l) l' f' f)
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (FieldList l) l' f' f
forall a b. a -> b -> a
const (([f (FieldList l' l' f' f')] -> Maybe3 (FieldList l) l' f' f)
 -> NonEmpty (f (Variant l' l' f' f'))
 -> [f (FieldList l' l' f' f')]
 -> Maybe3 (FieldList l) l' f' f)
-> ([f (FieldList l' l' f' f')] -> Maybe3 (FieldList l) l' f' f)
-> NonEmpty (f (Variant l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (FieldList l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (FieldList l) l' f' f
-> [f (FieldList l' l' f' f')] -> Maybe3 (FieldList l) l' f' f
forall a b. a -> b -> a
const Maybe3 (FieldList l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   variant :: NonEmpty (f (CaseLabels l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Variant (WirthySubsetOf l) l' f' f
variant = ([f (FieldList l' l' f' f')] -> Maybe3 (Variant l) l' f' f)
-> NonEmpty (f (CaseLabels l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (Variant l) l' f' f
forall a b. a -> b -> a
const (([f (FieldList l' l' f' f')] -> Maybe3 (Variant l) l' f' f)
 -> NonEmpty (f (CaseLabels l' l' f' f'))
 -> [f (FieldList l' l' f' f')]
 -> Maybe3 (Variant l) l' f' f)
-> ([f (FieldList l' l' f' f')] -> Maybe3 (Variant l) l' f' f)
-> NonEmpty (f (CaseLabels l' l' f' f'))
-> [f (FieldList l' l' f' f')]
-> Maybe3 (Variant l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Variant l) l' f' f
-> [f (FieldList l' l' f' f')] -> Maybe3 (Variant l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Variant l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3

   -- Type
   enumeration :: IdentList l' -> Type (WirthySubsetOf l) l' f' f
enumeration = Maybe3 (Type l) l' f' f -> IdentList l' -> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Type l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   subRange :: Maybe (QualIdent l')
-> f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f')
-> Type (WirthySubsetOf l) l' f' f
subRange = (f (ConstExpression l' l' f' f')
 -> f (ConstExpression l' l' f' f') -> Maybe3 (Type l) l' f' f)
-> Maybe (QualIdent l')
-> f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f')
-> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const ((f (ConstExpression l' l' f' f')
  -> f (ConstExpression l' l' f' f') -> Maybe3 (Type l) l' f' f)
 -> Maybe (QualIdent l')
 -> f (ConstExpression l' l' f' f')
 -> f (ConstExpression l' l' f' f')
 -> Maybe3 (Type l) l' f' f)
-> (f (ConstExpression l' l' f' f')
    -> f (ConstExpression l' l' f' f') -> Maybe3 (Type l) l' f' f)
-> Maybe (QualIdent l')
-> f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f')
-> Maybe3 (Type l) l' f' f
forall a b. (a -> b) -> a -> b
$ (f (ConstExpression l' l' f' f') -> Maybe3 (Type l) l' f' f)
-> f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f')
-> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const ((f (ConstExpression l' l' f' f') -> Maybe3 (Type l) l' f' f)
 -> f (ConstExpression l' l' f' f')
 -> f (ConstExpression l' l' f' f')
 -> Maybe3 (Type l) l' f' f)
-> (f (ConstExpression l' l' f' f') -> Maybe3 (Type l) l' f' f)
-> f (ConstExpression l' l' f' f')
-> f (ConstExpression l' l' f' f')
-> Maybe3 (Type l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Type l) l' f' f
-> f (ConstExpression l' l' f' f') -> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Type l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   arrayType :: [f (Type l' l' f' f')]
-> f (Type l' l' f' f') -> Type (WirthySubsetOf l) l' f' f
arrayType = (f (Type l' l' f' f') -> Maybe3 (Type l) l' f' f)
-> [f (Type l' l' f' f')]
-> f (Type l' l' f' f')
-> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const ((f (Type l' l' f' f') -> Maybe3 (Type l) l' f' f)
 -> [f (Type l' l' f' f')]
 -> f (Type l' l' f' f')
 -> Maybe3 (Type l) l' f' f)
-> (f (Type l' l' f' f') -> Maybe3 (Type l) l' f' f)
-> [f (Type l' l' f' f')]
-> f (Type l' l' f' f')
-> Maybe3 (Type l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Type l) l' f' f
-> f (Type l' l' f' f') -> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Type l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   setType :: f (Type l' l' f' f') -> Type (WirthySubsetOf l) l' f' f
setType = Maybe3 (Type l) l' f' f
-> f (Type l' l' f' f') -> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Type l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   recordType :: [f (FieldList l' l' f' f')] -> Type (WirthySubsetOf l) l' f' f
recordType = Maybe3 (Type l) l' f' f
-> [f (FieldList l' l' f' f')] -> Maybe3 (Type l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Type l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3

   -- Statement
   withStatement :: f (Designator l' l' f' f')
-> f (StatementSequence l' l' f' f')
-> Statement (WirthySubsetOf l) l' f' f
withStatement = (f (StatementSequence l' l' f' f') -> Maybe3 (Statement l) l' f' f)
-> f (Designator l' l' f' f')
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. a -> b -> a
const ((f (StatementSequence l' l' f' f')
  -> Maybe3 (Statement l) l' f' f)
 -> f (Designator l' l' f' f')
 -> f (StatementSequence l' l' f' f')
 -> Maybe3 (Statement l) l' f' f)
-> (f (StatementSequence l' l' f' f')
    -> Maybe3 (Statement l) l' f' f)
-> f (Designator l' l' f' f')
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Statement l) l' f' f
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Statement l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   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 (WirthySubsetOf l) l' f' f
forStatement = (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')
 -> Maybe3 (Statement l) 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')
-> Maybe3 (Statement l) l' f' f
forall a b. a -> b -> a
const ((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')
  -> Maybe3 (Statement l) 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')
 -> Maybe3 (Statement l) l' f' f)
-> (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')
    -> Maybe3 (Statement l) 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')
-> Maybe3 (Statement l) l' f' f
forall a b. (a -> b) -> a -> b
$ (f (Expression l' l' f' f')
 -> Maybe (f (Expression l' l' f' f'))
 -> f (StatementSequence l' l' f' f')
 -> Maybe3 (Statement l) l' f' f)
-> 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')
-> Maybe3 (Statement l) l' f' f
forall a b. a -> b -> a
const ((f (Expression l' l' f' f')
  -> Maybe (f (Expression l' l' f' f'))
  -> f (StatementSequence l' l' f' f')
  -> Maybe3 (Statement l) l' f' f)
 -> 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')
 -> Maybe3 (Statement l) l' f' f)
-> (f (Expression l' l' f' f')
    -> Maybe (f (Expression l' l' f' f'))
    -> f (StatementSequence l' l' f' f')
    -> Maybe3 (Statement l) l' f' f)
-> 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')
-> Maybe3 (Statement l) l' f' f
forall a b. (a -> b) -> a -> b
$ (Maybe (f (Expression l' l' f' f'))
 -> f (StatementSequence l' l' f' f')
 -> Maybe3 (Statement l) l' f' f)
-> f (Expression l' l' f' f')
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. a -> b -> a
const ((Maybe (f (Expression l' l' f' f'))
  -> f (StatementSequence l' l' f' f')
  -> Maybe3 (Statement l) l' f' f)
 -> f (Expression l' l' f' f')
 -> Maybe (f (Expression l' l' f' f'))
 -> f (StatementSequence l' l' f' f')
 -> Maybe3 (Statement l) l' f' f)
-> (Maybe (f (Expression l' l' f' f'))
    -> f (StatementSequence l' l' f' f')
    -> Maybe3 (Statement l) l' f' f)
-> f (Expression l' l' f' f')
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. (a -> b) -> a -> b
$ (f (StatementSequence l' l' f' f') -> Maybe3 (Statement l) l' f' f)
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. a -> b -> a
const ((f (StatementSequence l' l' f' f')
  -> Maybe3 (Statement l) l' f' f)
 -> Maybe (f (Expression l' l' f' f'))
 -> f (StatementSequence l' l' f' f')
 -> Maybe3 (Statement l) l' f' f)
-> (f (StatementSequence l' l' f' f')
    -> Maybe3 (Statement l) l' f' f)
-> Maybe (f (Expression l' l' f' f'))
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Statement l) l' f' f
-> f (StatementSequence l' l' f' f')
-> Maybe3 (Statement l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Statement l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3

   -- Expression
   set :: Maybe (QualIdent l')
-> [f (Element l' l' f' f')]
-> Expression (WirthySubsetOf l) l' f' f
set = ([f (Element l' l' f' f')] -> Maybe3 (Expression l) l' f' f)
-> Maybe (QualIdent l')
-> [f (Element l' l' f' f')]
-> Maybe3 (Expression l) l' f' f
forall a b. a -> b -> a
const (([f (Element l' l' f' f')] -> Maybe3 (Expression l) l' f' f)
 -> Maybe (QualIdent l')
 -> [f (Element l' l' f' f')]
 -> Maybe3 (Expression l) l' f' f)
-> ([f (Element l' l' f' f')] -> Maybe3 (Expression l) l' f' f)
-> Maybe (QualIdent l')
-> [f (Element l' l' f' f')]
-> Maybe3 (Expression l) l' f' f
forall a b. (a -> b) -> a -> b
$ Maybe3 (Expression l) l' f' f
-> [f (Element l' l' f' f')] -> Maybe3 (Expression l) l' f' f
forall a b. a -> b -> a
const Maybe3 (Expression l) l' f' f
forall k1 k2 k3 (f :: k1 -> k2 -> k3 -> *) (a :: k1) (b :: k2)
       (c :: k3).
Maybe3 f a b c
nothing3
   qualIdent :: [Ident] -> Ident -> QualIdent (WirthySubsetOf l)
qualIdent = (Ident -> Maybe (QualIdent l))
-> [Ident] -> Ident -> Maybe (QualIdent l)
forall a b. a -> b -> a
const ((Ident -> Maybe (QualIdent l))
 -> [Ident] -> Ident -> Maybe (QualIdent l))
-> (Ident -> Maybe (QualIdent l))
-> [Ident]
-> Ident
-> Maybe (QualIdent l)
forall a b. (a -> b) -> a -> b
$ Maybe (QualIdent l) -> Ident -> Maybe (QualIdent l)
forall a b. a -> b -> a
const Maybe (QualIdent l)
forall a. Maybe a
Nothing