{-# LANGUAGE FlexibleInstances   #-}
{-# LANGUAGE InstanceSigs        #-}
{-# LANGUAGE LambdaCase          #-}
{-# LANGUAGE NamedFieldPuns      #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StrictData          #-}
module Language.Cimple.TraverseAst
    ( TraverseAst (..)
    , AstActions (..)
    , defaultActions
    ) where

import           Data.Text             (Text)
import           Language.Cimple.AST   (Node (..))
import           Language.Cimple.Lexer (Lexeme (..))

class TraverseAst a where
    traverseAst :: Applicative f => AstActions f Text -> a -> f a

data AstActions f text = AstActions
    { AstActions f text -> FilePath
currentFile :: FilePath
    , AstActions f text
-> [(FilePath, [Node (Lexeme text)])]
-> f [(FilePath, [Node (Lexeme text)])]
-> f [(FilePath, [Node (Lexeme text)])]
doUnits     :: [(FilePath, [Node (Lexeme text)])] -> f [(FilePath, [Node (Lexeme text)])] -> f [(FilePath, [Node (Lexeme text)])]
    , AstActions f text
-> (FilePath, [Node (Lexeme text)])
-> f (FilePath, [Node (Lexeme text)])
-> f (FilePath, [Node (Lexeme text)])
doUnit      ::  (FilePath, [Node (Lexeme text)])  -> f  (FilePath, [Node (Lexeme text)])  -> f  (FilePath, [Node (Lexeme text)])
    , AstActions f text
-> FilePath
-> [Node (Lexeme text)]
-> f [Node (Lexeme text)]
-> f [Node (Lexeme text)]
doNodes     :: FilePath -> [Node (Lexeme text)]   -> f             [Node (Lexeme text)]   -> f             [Node (Lexeme text)]
    , AstActions f text
-> FilePath
-> Node (Lexeme text)
-> f (Node (Lexeme text))
-> f (Node (Lexeme text))
doNode      :: FilePath ->  Node (Lexeme text)    -> f             (Node (Lexeme text))   -> f             (Node (Lexeme text))
    , AstActions f text
-> FilePath -> [Lexeme text] -> f [Lexeme text] -> f [Lexeme text]
doLexemes   :: FilePath ->       [Lexeme text]    -> f                   [Lexeme text]    -> f                   [Lexeme text]
    , AstActions f text
-> FilePath -> Lexeme text -> f (Lexeme text) -> f (Lexeme text)
doLexeme    :: FilePath ->        Lexeme text     -> f                   (Lexeme text)    -> f                   (Lexeme text)
    , AstActions f text -> FilePath -> text -> f text -> f text
doText      :: FilePath ->               text     -> f                           text     -> f                           text
    }

instance TraverseAst a => TraverseAst (Maybe a) where
    traverseAst :: AstActions f Text -> Maybe a -> f (Maybe a)
traverseAst AstActions f Text
_          Maybe a
Nothing  = Maybe a -> f (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
    traverseAst AstActions f Text
astActions (Just a
x) = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> f a -> f (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AstActions f Text -> a -> f a
forall a (f :: * -> *).
(TraverseAst a, Applicative f) =>
AstActions f Text -> a -> f a
traverseAst AstActions f Text
astActions a
x

defaultActions :: Applicative f => AstActions f lexeme
defaultActions :: AstActions f lexeme
defaultActions = AstActions :: forall (f :: * -> *) text.
FilePath
-> ([(FilePath, [Node (Lexeme text)])]
    -> f [(FilePath, [Node (Lexeme text)])]
    -> f [(FilePath, [Node (Lexeme text)])])
-> ((FilePath, [Node (Lexeme text)])
    -> f (FilePath, [Node (Lexeme text)])
    -> f (FilePath, [Node (Lexeme text)]))
-> (FilePath
    -> [Node (Lexeme text)]
    -> f [Node (Lexeme text)]
    -> f [Node (Lexeme text)])
-> (FilePath
    -> Node (Lexeme text)
    -> f (Node (Lexeme text))
    -> f (Node (Lexeme text)))
-> (FilePath
    -> [Lexeme text] -> f [Lexeme text] -> f [Lexeme text])
-> (FilePath -> Lexeme text -> f (Lexeme text) -> f (Lexeme text))
-> (FilePath -> text -> f text -> f text)
-> AstActions f text
AstActions
    { currentFile :: FilePath
currentFile = FilePath
"<stdin>"
    , doUnits :: [(FilePath, [Node (Lexeme lexeme)])]
-> f [(FilePath, [Node (Lexeme lexeme)])]
-> f [(FilePath, [Node (Lexeme lexeme)])]
doUnits     = (f [(FilePath, [Node (Lexeme lexeme)])]
 -> f [(FilePath, [Node (Lexeme lexeme)])])
-> [(FilePath, [Node (Lexeme lexeme)])]
-> f [(FilePath, [Node (Lexeme lexeme)])]
-> f [(FilePath, [Node (Lexeme lexeme)])]
forall a b. a -> b -> a
const f [(FilePath, [Node (Lexeme lexeme)])]
-> f [(FilePath, [Node (Lexeme lexeme)])]
forall a. a -> a
id
    , doUnit :: (FilePath, [Node (Lexeme lexeme)])
-> f (FilePath, [Node (Lexeme lexeme)])
-> f (FilePath, [Node (Lexeme lexeme)])
doUnit      = (f (FilePath, [Node (Lexeme lexeme)])
 -> f (FilePath, [Node (Lexeme lexeme)]))
-> (FilePath, [Node (Lexeme lexeme)])
-> f (FilePath, [Node (Lexeme lexeme)])
-> f (FilePath, [Node (Lexeme lexeme)])
forall a b. a -> b -> a
const f (FilePath, [Node (Lexeme lexeme)])
-> f (FilePath, [Node (Lexeme lexeme)])
forall a. a -> a
id
    , doNodes :: FilePath
-> [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
doNodes     = ([Node (Lexeme lexeme)]
 -> f [Node (Lexeme lexeme)] -> f [Node (Lexeme lexeme)])
-> FilePath
-> [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
forall a b. a -> b -> a
const (([Node (Lexeme lexeme)]
  -> f [Node (Lexeme lexeme)] -> f [Node (Lexeme lexeme)])
 -> FilePath
 -> [Node (Lexeme lexeme)]
 -> f [Node (Lexeme lexeme)]
 -> f [Node (Lexeme lexeme)])
-> ([Node (Lexeme lexeme)]
    -> f [Node (Lexeme lexeme)] -> f [Node (Lexeme lexeme)])
-> FilePath
-> [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
forall a b. (a -> b) -> a -> b
$ (f [Node (Lexeme lexeme)] -> f [Node (Lexeme lexeme)])
-> [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)]
forall a b. a -> b -> a
const f [Node (Lexeme lexeme)] -> f [Node (Lexeme lexeme)]
forall a. a -> a
id
    , doNode :: FilePath
-> Node (Lexeme lexeme)
-> f (Node (Lexeme lexeme))
-> f (Node (Lexeme lexeme))
doNode      = (Node (Lexeme lexeme)
 -> f (Node (Lexeme lexeme)) -> f (Node (Lexeme lexeme)))
-> FilePath
-> Node (Lexeme lexeme)
-> f (Node (Lexeme lexeme))
-> f (Node (Lexeme lexeme))
forall a b. a -> b -> a
const ((Node (Lexeme lexeme)
  -> f (Node (Lexeme lexeme)) -> f (Node (Lexeme lexeme)))
 -> FilePath
 -> Node (Lexeme lexeme)
 -> f (Node (Lexeme lexeme))
 -> f (Node (Lexeme lexeme)))
-> (Node (Lexeme lexeme)
    -> f (Node (Lexeme lexeme)) -> f (Node (Lexeme lexeme)))
-> FilePath
-> Node (Lexeme lexeme)
-> f (Node (Lexeme lexeme))
-> f (Node (Lexeme lexeme))
forall a b. (a -> b) -> a -> b
$ (f (Node (Lexeme lexeme)) -> f (Node (Lexeme lexeme)))
-> Node (Lexeme lexeme)
-> f (Node (Lexeme lexeme))
-> f (Node (Lexeme lexeme))
forall a b. a -> b -> a
const f (Node (Lexeme lexeme)) -> f (Node (Lexeme lexeme))
forall a. a -> a
id
    , doLexeme :: FilePath -> Lexeme lexeme -> f (Lexeme lexeme) -> f (Lexeme lexeme)
doLexeme    = (Lexeme lexeme -> f (Lexeme lexeme) -> f (Lexeme lexeme))
-> FilePath
-> Lexeme lexeme
-> f (Lexeme lexeme)
-> f (Lexeme lexeme)
forall a b. a -> b -> a
const ((Lexeme lexeme -> f (Lexeme lexeme) -> f (Lexeme lexeme))
 -> FilePath
 -> Lexeme lexeme
 -> f (Lexeme lexeme)
 -> f (Lexeme lexeme))
-> (Lexeme lexeme -> f (Lexeme lexeme) -> f (Lexeme lexeme))
-> FilePath
-> Lexeme lexeme
-> f (Lexeme lexeme)
-> f (Lexeme lexeme)
forall a b. (a -> b) -> a -> b
$ (f (Lexeme lexeme) -> f (Lexeme lexeme))
-> Lexeme lexeme -> f (Lexeme lexeme) -> f (Lexeme lexeme)
forall a b. a -> b -> a
const f (Lexeme lexeme) -> f (Lexeme lexeme)
forall a. a -> a
id
    , doLexemes :: FilePath
-> [Lexeme lexeme] -> f [Lexeme lexeme] -> f [Lexeme lexeme]
doLexemes   = ([Lexeme lexeme] -> f [Lexeme lexeme] -> f [Lexeme lexeme])
-> FilePath
-> [Lexeme lexeme]
-> f [Lexeme lexeme]
-> f [Lexeme lexeme]
forall a b. a -> b -> a
const (([Lexeme lexeme] -> f [Lexeme lexeme] -> f [Lexeme lexeme])
 -> FilePath
 -> [Lexeme lexeme]
 -> f [Lexeme lexeme]
 -> f [Lexeme lexeme])
-> ([Lexeme lexeme] -> f [Lexeme lexeme] -> f [Lexeme lexeme])
-> FilePath
-> [Lexeme lexeme]
-> f [Lexeme lexeme]
-> f [Lexeme lexeme]
forall a b. (a -> b) -> a -> b
$ (f [Lexeme lexeme] -> f [Lexeme lexeme])
-> [Lexeme lexeme] -> f [Lexeme lexeme] -> f [Lexeme lexeme]
forall a b. a -> b -> a
const f [Lexeme lexeme] -> f [Lexeme lexeme]
forall a. a -> a
id
    , doText :: FilePath -> lexeme -> f lexeme -> f lexeme
doText      = (lexeme -> f lexeme -> f lexeme)
-> FilePath -> lexeme -> f lexeme -> f lexeme
forall a b. a -> b -> a
const ((lexeme -> f lexeme -> f lexeme)
 -> FilePath -> lexeme -> f lexeme -> f lexeme)
-> (lexeme -> f lexeme -> f lexeme)
-> FilePath
-> lexeme
-> f lexeme
-> f lexeme
forall a b. (a -> b) -> a -> b
$ (f lexeme -> f lexeme) -> lexeme -> f lexeme -> f lexeme
forall a b. a -> b -> a
const f lexeme -> f lexeme
forall a. a -> a
id
    }

instance TraverseAst Text where
    traverseAst :: forall f . Applicative f
                => AstActions f Text -> Text -> f Text
    traverseAst :: AstActions f Text -> Text -> f Text
traverseAst astActions :: AstActions f Text
astActions@AstActions{FilePath
currentFile :: FilePath
currentFile :: forall (f :: * -> *) text. AstActions f text -> FilePath
currentFile} = AstActions f Text -> FilePath -> Text -> f Text -> f Text
forall (f :: * -> *) text.
AstActions f text -> FilePath -> text -> f text -> f text
doText AstActions f Text
astActions FilePath
currentFile (Text -> f Text -> f Text) -> (Text -> f Text) -> Text -> f Text
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> f Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure

instance TraverseAst (Lexeme Text) where
    traverseAst :: forall f . Applicative f
                => AstActions f Text -> Lexeme Text -> f (Lexeme Text)
    traverseAst :: AstActions f Text -> Lexeme Text -> f (Lexeme Text)
traverseAst astActions :: AstActions f Text
astActions@AstActions{FilePath
currentFile :: FilePath
currentFile :: forall (f :: * -> *) text. AstActions f text -> FilePath
currentFile} = AstActions f Text
-> FilePath -> Lexeme Text -> f (Lexeme Text) -> f (Lexeme Text)
forall (f :: * -> *) text.
AstActions f text
-> FilePath -> Lexeme text -> f (Lexeme text) -> f (Lexeme text)
doLexeme AstActions f Text
astActions FilePath
currentFile (Lexeme Text -> f (Lexeme Text) -> f (Lexeme Text))
-> (Lexeme Text -> f (Lexeme Text))
-> Lexeme Text
-> f (Lexeme Text)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> \case
        L AlexPosn
p LexemeClass
c Text
s -> AlexPosn -> LexemeClass -> Text -> Lexeme Text
forall text. AlexPosn -> LexemeClass -> text -> Lexeme text
L AlexPosn
p LexemeClass
c (Text -> Lexeme Text) -> f Text -> f (Lexeme Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> f Text
forall a. TraverseAst a => a -> f a
recurse Text
s
      where
        recurse :: TraverseAst a => a -> f a
        recurse :: a -> f a
recurse = AstActions f Text -> a -> f a
forall a (f :: * -> *).
(TraverseAst a, Applicative f) =>
AstActions f Text -> a -> f a
traverseAst AstActions f Text
astActions

instance TraverseAst [Lexeme Text] where
    traverseAst :: AstActions f Text -> [Lexeme Text] -> f [Lexeme Text]
traverseAst astActions :: AstActions f Text
astActions@AstActions{FilePath
currentFile :: FilePath
currentFile :: forall (f :: * -> *) text. AstActions f text -> FilePath
currentFile} = AstActions f Text
-> FilePath -> [Lexeme Text] -> f [Lexeme Text] -> f [Lexeme Text]
forall (f :: * -> *) text.
AstActions f text
-> FilePath -> [Lexeme text] -> f [Lexeme text] -> f [Lexeme text]
doLexemes AstActions f Text
astActions FilePath
currentFile ([Lexeme Text] -> f [Lexeme Text] -> f [Lexeme Text])
-> ([Lexeme Text] -> f [Lexeme Text])
-> [Lexeme Text]
-> f [Lexeme Text]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
        (Lexeme Text -> f (Lexeme Text))
-> [Lexeme Text] -> f [Lexeme Text]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (AstActions f Text -> Lexeme Text -> f (Lexeme Text)
forall a (f :: * -> *).
(TraverseAst a, Applicative f) =>
AstActions f Text -> a -> f a
traverseAst AstActions f Text
astActions)

instance TraverseAst (Node (Lexeme Text)) where
    traverseAst :: forall f . Applicative f
                => AstActions f Text -> Node (Lexeme Text) -> f (Node (Lexeme Text))
    traverseAst :: AstActions f Text -> Node (Lexeme Text) -> f (Node (Lexeme Text))
traverseAst astActions :: AstActions f Text
astActions@AstActions{FilePath
currentFile :: FilePath
currentFile :: forall (f :: * -> *) text. AstActions f text -> FilePath
currentFile} = AstActions f Text
-> FilePath
-> Node (Lexeme Text)
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text))
forall (f :: * -> *) text.
AstActions f text
-> FilePath
-> Node (Lexeme text)
-> f (Node (Lexeme text))
-> f (Node (Lexeme text))
doNode AstActions f Text
astActions FilePath
currentFile (Node (Lexeme Text)
 -> f (Node (Lexeme Text)) -> f (Node (Lexeme Text)))
-> (Node (Lexeme Text) -> f (Node (Lexeme Text)))
-> Node (Lexeme Text)
-> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> \case
        PreprocInclude Lexeme Text
path ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
PreprocInclude (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
path
        PreprocDefine Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
PreprocDefine (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        PreprocDefineConst Lexeme Text
name Node (Lexeme Text)
value ->
            Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme -> Node lexeme
PreprocDefineConst (Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
value
        PreprocDefineMacro Lexeme Text
name [Node (Lexeme Text)]
params Node (Lexeme Text)
body ->
            Lexeme Text
-> [Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
lexeme -> [Node lexeme] -> Node lexeme -> Node lexeme
PreprocDefineMacro (Lexeme Text
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text)
 -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)]
      -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)]
   -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
params f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
body
        PreprocIf Node (Lexeme Text)
cond [Node (Lexeme Text)]
thenDecls Node (Lexeme Text)
elseBranch ->
            Node (Lexeme Text)
-> [Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> [Node lexeme] -> Node lexeme -> Node lexeme
PreprocIf (Node (Lexeme Text)
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text)
 -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)]
      -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond f ([Node (Lexeme Text)]
   -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
thenDecls f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
elseBranch
        PreprocIfdef Lexeme Text
name [Node (Lexeme Text)]
thenDecls Node (Lexeme Text)
elseBranch ->
            Lexeme Text
-> [Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
lexeme -> [Node lexeme] -> Node lexeme -> Node lexeme
PreprocIfdef (Lexeme Text
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text)
 -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)]
      -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)]
   -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
thenDecls f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
elseBranch
        PreprocIfndef Lexeme Text
name [Node (Lexeme Text)]
thenDecls Node (Lexeme Text)
elseBranch ->
            Lexeme Text
-> [Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
lexeme -> [Node lexeme] -> Node lexeme -> Node lexeme
PreprocIfndef (Lexeme Text
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text)
 -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)]
      -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)]
   -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
thenDecls f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
elseBranch
        PreprocElse [Node (Lexeme Text)]
decls ->
            [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme
PreprocElse ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
decls
        PreprocElif Node (Lexeme Text)
cond [Node (Lexeme Text)]
decls Node (Lexeme Text)
elseBranch ->
            Node (Lexeme Text)
-> [Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> [Node lexeme] -> Node lexeme -> Node lexeme
PreprocElif (Node (Lexeme Text)
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text)
 -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)]
      -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond f ([Node (Lexeme Text)]
   -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
decls f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
elseBranch
        PreprocUndef Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
PreprocUndef (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        PreprocDefined Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
PreprocDefined (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        PreprocScopedDefine Node (Lexeme Text)
define [Node (Lexeme Text)]
stmts Node (Lexeme Text)
undef ->
            Node (Lexeme Text)
-> [Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> [Node lexeme] -> Node lexeme -> Node lexeme
PreprocScopedDefine (Node (Lexeme Text)
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text)
 -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)]
      -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
define f ([Node (Lexeme Text)]
   -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
stmts f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
undef
        MacroBodyStmt [Node (Lexeme Text)]
stmts ->
            [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme
MacroBodyStmt ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
stmts
        MacroBodyFunCall Node (Lexeme Text)
expr ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
MacroBodyFunCall (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
expr
        MacroParam Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
MacroParam (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        StaticAssert Node (Lexeme Text)
cond Lexeme Text
msg ->
            Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text)
forall lexeme. Node lexeme -> lexeme -> Node lexeme
StaticAssert (Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond f (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
msg
        LicenseDecl Lexeme Text
license [Node (Lexeme Text)]
copyrights ->
            Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. lexeme -> [Node lexeme] -> Node lexeme
LicenseDecl (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
license f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
copyrights
        CopyrightDecl Lexeme Text
from Maybe (Lexeme Text)
to [Lexeme Text]
owner ->
            Lexeme Text
-> Maybe (Lexeme Text) -> [Lexeme Text] -> Node (Lexeme Text)
forall lexeme. lexeme -> Maybe lexeme -> [lexeme] -> Node lexeme
CopyrightDecl (Lexeme Text
 -> Maybe (Lexeme Text) -> [Lexeme Text] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f (Maybe (Lexeme Text) -> [Lexeme Text] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
from f (Maybe (Lexeme Text) -> [Lexeme Text] -> Node (Lexeme Text))
-> f (Maybe (Lexeme Text))
-> f ([Lexeme Text] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Lexeme Text) -> f (Maybe (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Maybe (Lexeme Text)
to f ([Lexeme Text] -> Node (Lexeme Text))
-> f [Lexeme Text] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Lexeme Text] -> f [Lexeme Text]
forall a. TraverseAst a => a -> f a
recurse [Lexeme Text]
owner
        Comment CommentStyle
doc Lexeme Text
start [Node (Lexeme Text)]
contents Lexeme Text
end ->
            CommentStyle
-> Lexeme Text
-> [Node (Lexeme Text)]
-> Lexeme Text
-> Node (Lexeme Text)
forall lexeme.
CommentStyle -> lexeme -> [Node lexeme] -> lexeme -> Node lexeme
Comment CommentStyle
doc (Lexeme Text
 -> [Node (Lexeme Text)] -> Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
start f ([Node (Lexeme Text)] -> Lexeme Text -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
contents f (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
end
        CommentBlock Lexeme Text
comment ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
CommentBlock (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
comment
        CommentWord Lexeme Text
word ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
CommentWord (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
word
        Commented Node (Lexeme Text)
comment Node (Lexeme Text)
node ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
Commented (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
comment f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
node
        ExternC [Node (Lexeme Text)]
decls ->
            [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme
ExternC ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
decls
        CompoundStmt [Node (Lexeme Text)]
stmts ->
            [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme
CompoundStmt ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
stmts
        Node (Lexeme Text)
Break ->
            Node (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a. Applicative f => a -> f a
pure Node (Lexeme Text)
forall lexeme. Node lexeme
Break
        Goto Lexeme Text
label ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
Goto (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
label
        Node (Lexeme Text)
Continue ->
            Node (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a. Applicative f => a -> f a
pure Node (Lexeme Text)
forall lexeme. Node lexeme
Continue
        Return Maybe (Node (Lexeme Text))
value ->
            Maybe (Node (Lexeme Text)) -> Node (Lexeme Text)
forall lexeme. Maybe (Node lexeme) -> Node lexeme
Return (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text))) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (Node (Lexeme Text)) -> f (Maybe (Node (Lexeme Text)))
forall a. TraverseAst a => a -> f a
recurse Maybe (Node (Lexeme Text))
value
        SwitchStmt Node (Lexeme Text)
value [Node (Lexeme Text)]
cases ->
            Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. Node lexeme -> [Node lexeme] -> Node lexeme
SwitchStmt (Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
value f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
cases
        IfStmt Node (Lexeme Text)
cond [Node (Lexeme Text)]
thenStmts Maybe (Node (Lexeme Text))
elseStmt ->
            Node (Lexeme Text)
-> [Node (Lexeme Text)]
-> Maybe (Node (Lexeme Text))
-> Node (Lexeme Text)
forall lexeme.
Node lexeme -> [Node lexeme] -> Maybe (Node lexeme) -> Node lexeme
IfStmt (Node (Lexeme Text)
 -> [Node (Lexeme Text)]
 -> Maybe (Node (Lexeme Text))
 -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)]
      -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond f ([Node (Lexeme Text)]
   -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
thenStmts f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text))) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Node (Lexeme Text)) -> f (Maybe (Node (Lexeme Text)))
forall a. TraverseAst a => a -> f a
recurse Maybe (Node (Lexeme Text))
elseStmt
        ForStmt Node (Lexeme Text)
initStmt Node (Lexeme Text)
cond Node (Lexeme Text)
next [Node (Lexeme Text)]
stmts ->
            Node (Lexeme Text)
-> Node (Lexeme Text)
-> Node (Lexeme Text)
-> [Node (Lexeme Text)]
-> Node (Lexeme Text)
forall lexeme.
Node lexeme
-> Node lexeme -> Node lexeme -> [Node lexeme] -> Node lexeme
ForStmt (Node (Lexeme Text)
 -> Node (Lexeme Text)
 -> Node (Lexeme Text)
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text)
      -> Node (Lexeme Text)
      -> [Node (Lexeme Text)]
      -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
initStmt f (Node (Lexeme Text)
   -> Node (Lexeme Text)
   -> [Node (Lexeme Text)]
   -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text)
      -> [Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond f (Node (Lexeme Text)
   -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
next f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
stmts
        WhileStmt Node (Lexeme Text)
cond [Node (Lexeme Text)]
stmts ->
            Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. Node lexeme -> [Node lexeme] -> Node lexeme
WhileStmt (Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
stmts
        DoWhileStmt [Node (Lexeme Text)]
stmts Node (Lexeme Text)
cond ->
            [Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme -> Node lexeme
DoWhileStmt ([Node (Lexeme Text)] -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
stmts f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond
        Case Node (Lexeme Text)
value Node (Lexeme Text)
stmt ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
Case (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
value f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
stmt
        Default Node (Lexeme Text)
stmt ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
Default (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
stmt
        Label Lexeme Text
label Node (Lexeme Text)
stmt ->
            Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme -> Node lexeme
Label (Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
label f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
stmt
        VLA Node (Lexeme Text)
ty Lexeme Text
name Node (Lexeme Text)
size ->
            Node (Lexeme Text)
-> Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> lexeme -> Node lexeme -> Node lexeme
VLA (Node (Lexeme Text)
 -> Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
size
        VarDecl Node (Lexeme Text)
ty Node (Lexeme Text)
decl ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
VarDecl (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
decl
        Declarator Node (Lexeme Text)
spec Maybe (Node (Lexeme Text))
value ->
            Node (Lexeme Text)
-> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Maybe (Node lexeme) -> Node lexeme
Declarator (Node (Lexeme Text)
 -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
spec f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text))) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Node (Lexeme Text)) -> f (Maybe (Node (Lexeme Text)))
forall a. TraverseAst a => a -> f a
recurse Maybe (Node (Lexeme Text))
value
        DeclSpecVar Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
DeclSpecVar (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        DeclSpecArray Node (Lexeme Text)
spec Maybe (Node (Lexeme Text))
size ->
            Node (Lexeme Text)
-> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Maybe (Node lexeme) -> Node lexeme
DeclSpecArray (Node (Lexeme Text)
 -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
spec f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text))) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Node (Lexeme Text)) -> f (Maybe (Node (Lexeme Text)))
forall a. TraverseAst a => a -> f a
recurse Maybe (Node (Lexeme Text))
size
        InitialiserList [Node (Lexeme Text)]
values ->
            [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme
InitialiserList ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
values
        UnaryExpr UnaryOp
op Node (Lexeme Text)
expr ->
            UnaryOp -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. UnaryOp -> Node lexeme -> Node lexeme
UnaryExpr UnaryOp
op (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
expr
        BinaryExpr Node (Lexeme Text)
lhs BinaryOp
op Node (Lexeme Text)
rhs ->
            Node (Lexeme Text)
-> BinaryOp -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> BinaryOp -> Node lexeme -> Node lexeme
BinaryExpr (Node (Lexeme Text)
 -> BinaryOp -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (BinaryOp -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
lhs f (BinaryOp -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f BinaryOp -> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> BinaryOp -> f BinaryOp
forall (f :: * -> *) a. Applicative f => a -> f a
pure BinaryOp
op f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
rhs
        TernaryExpr Node (Lexeme Text)
cond Node (Lexeme Text)
thenExpr Node (Lexeme Text)
elseExpr ->
            Node (Lexeme Text)
-> Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> Node lexeme -> Node lexeme -> Node lexeme
TernaryExpr (Node (Lexeme Text)
 -> Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text)
      -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
cond f (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
thenExpr f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
elseExpr
        AssignExpr Node (Lexeme Text)
lhs AssignOp
op Node (Lexeme Text)
rhs ->
            Node (Lexeme Text)
-> AssignOp -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> AssignOp -> Node lexeme -> Node lexeme
AssignExpr (Node (Lexeme Text)
 -> AssignOp -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (AssignOp -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
lhs f (AssignOp -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f AssignOp -> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AssignOp -> f AssignOp
forall (f :: * -> *) a. Applicative f => a -> f a
pure AssignOp
op f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
rhs
        ParenExpr Node (Lexeme Text)
expr ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
ParenExpr (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
expr
        CastExpr Node (Lexeme Text)
ty Node (Lexeme Text)
expr ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
CastExpr (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
expr
        CompoundExpr Node (Lexeme Text)
ty Node (Lexeme Text)
expr ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
CompoundExpr (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
expr
        SizeofExpr Node (Lexeme Text)
expr ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
SizeofExpr (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
expr
        SizeofType Node (Lexeme Text)
ty ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
SizeofType (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty
        LiteralExpr LiteralType
ty Lexeme Text
value ->
            LiteralType -> Lexeme Text -> Node (Lexeme Text)
forall lexeme. LiteralType -> lexeme -> Node lexeme
LiteralExpr LiteralType
ty (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
value
        VarExpr Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
VarExpr (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        MemberAccess Node (Lexeme Text)
name Lexeme Text
field ->
            Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text)
forall lexeme. Node lexeme -> lexeme -> Node lexeme
MemberAccess (Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
name f (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
field
        PointerAccess Node (Lexeme Text)
name Lexeme Text
field ->
            Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text)
forall lexeme. Node lexeme -> lexeme -> Node lexeme
PointerAccess (Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
name f (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
field
        ArrayAccess Node (Lexeme Text)
arr Node (Lexeme Text)
idx ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
ArrayAccess (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
arr f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
idx
        FunctionCall Node (Lexeme Text)
callee [Node (Lexeme Text)]
args ->
            Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. Node lexeme -> [Node lexeme] -> Node lexeme
FunctionCall (Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
callee f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
args
        CommentExpr Node (Lexeme Text)
comment Node (Lexeme Text)
expr ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
CommentExpr (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
comment f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
expr
        EnumClass Lexeme Text
name [Node (Lexeme Text)]
members ->
            Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. lexeme -> [Node lexeme] -> Node lexeme
EnumClass (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
members
        EnumConsts Maybe (Lexeme Text)
name [Node (Lexeme Text)]
members ->
            Maybe (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. Maybe lexeme -> [Node lexeme] -> Node lexeme
EnumConsts (Maybe (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Maybe (Lexeme Text))
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (Lexeme Text) -> f (Maybe (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Maybe (Lexeme Text)
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
members
        EnumDecl Lexeme Text
name [Node (Lexeme Text)]
members Lexeme Text
tyName ->
            Lexeme Text
-> [Node (Lexeme Text)] -> Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> [Node lexeme] -> lexeme -> Node lexeme
EnumDecl (Lexeme Text
 -> [Node (Lexeme Text)] -> Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Lexeme Text -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
members f (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
tyName
        Enumerator Lexeme Text
name Maybe (Node (Lexeme Text))
value ->
            Lexeme Text -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text)
forall lexeme. lexeme -> Maybe (Node lexeme) -> Node lexeme
Enumerator (Lexeme Text -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text))) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Node (Lexeme Text)) -> f (Maybe (Node (Lexeme Text)))
forall a. TraverseAst a => a -> f a
recurse Maybe (Node (Lexeme Text))
value
        Typedef Node (Lexeme Text)
ty Lexeme Text
name ->
            Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text)
forall lexeme. Node lexeme -> lexeme -> Node lexeme
Typedef (Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        TypedefFunction Node (Lexeme Text)
ty ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
TypedefFunction (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty
        Namespace Scope
scope Lexeme Text
name [Node (Lexeme Text)]
members ->
            Scope -> Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. Scope -> lexeme -> [Node lexeme] -> Node lexeme
Namespace Scope
scope (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
members
        Class Scope
scope Lexeme Text
name [Node (Lexeme Text)]
tyvars [Node (Lexeme Text)]
members ->
            Scope
-> Lexeme Text
-> [Node (Lexeme Text)]
-> [Node (Lexeme Text)]
-> Node (Lexeme Text)
forall lexeme.
Scope -> lexeme -> [Node lexeme] -> [Node lexeme] -> Node lexeme
Class Scope
scope (Lexeme Text
 -> [Node (Lexeme Text)]
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)]
      -> [Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)]
   -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
tyvars f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
members
        ClassForward Lexeme Text
name [Node (Lexeme Text)]
tyvars ->
            Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. lexeme -> [Node lexeme] -> Node lexeme
ClassForward (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
tyvars
        Struct Lexeme Text
name [Node (Lexeme Text)]
members ->
            Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. lexeme -> [Node lexeme] -> Node lexeme
Struct (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
members
        Union Lexeme Text
name [Node (Lexeme Text)]
members ->
            Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. lexeme -> [Node lexeme] -> Node lexeme
Union (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
members
        MemberDecl Node (Lexeme Text)
ty Node (Lexeme Text)
decl Maybe (Lexeme Text)
width ->
            Node (Lexeme Text)
-> Node (Lexeme Text) -> Maybe (Lexeme Text) -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> Node lexeme -> Maybe lexeme -> Node lexeme
MemberDecl (Node (Lexeme Text)
 -> Node (Lexeme Text) -> Maybe (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text)
      -> Maybe (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Node (Lexeme Text) -> Maybe (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Maybe (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
decl f (Maybe (Lexeme Text) -> Node (Lexeme Text))
-> f (Maybe (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Lexeme Text) -> f (Maybe (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Maybe (Lexeme Text)
width
        TyConst Node (Lexeme Text)
ty ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
TyConst (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty
        TyPointer Node (Lexeme Text)
ty ->
            Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme
TyPointer (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty
        TyStruct Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
TyStruct (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        TyFunc Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
TyFunc (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        TyVar Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
TyVar (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        TyStd Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
TyStd (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        TyUserDefined Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
TyUserDefined (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        FunctionDecl Scope
scope Node (Lexeme Text)
proto Maybe (Node (Lexeme Text))
errors ->
            Scope
-> Node (Lexeme Text)
-> Maybe (Node (Lexeme Text))
-> Node (Lexeme Text)
forall lexeme.
Scope -> Node lexeme -> Maybe (Node lexeme) -> Node lexeme
FunctionDecl Scope
scope (Node (Lexeme Text)
 -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
proto f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text))) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Node (Lexeme Text)) -> f (Maybe (Node (Lexeme Text)))
forall a. TraverseAst a => a -> f a
recurse Maybe (Node (Lexeme Text))
errors
        FunctionDefn Scope
scope Node (Lexeme Text)
proto [Node (Lexeme Text)]
body ->
            Scope
-> Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. Scope -> Node lexeme -> [Node lexeme] -> Node lexeme
FunctionDefn Scope
scope (Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
proto f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
body
        FunctionPrototype Node (Lexeme Text)
ty Lexeme Text
name [Node (Lexeme Text)]
params ->
            Node (Lexeme Text)
-> Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> lexeme -> [Node lexeme] -> Node lexeme
FunctionPrototype (Node (Lexeme Text)
 -> Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
params
        FunctionParam Node (Lexeme Text)
ty Node (Lexeme Text)
decl ->
            Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. Node lexeme -> Node lexeme -> Node lexeme
FunctionParam (Node (Lexeme Text) -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
decl
        Event Lexeme Text
name Node (Lexeme Text)
params ->
            Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme -> Node lexeme
Event (Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
params
        EventParams [Node (Lexeme Text)]
params ->
            [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme
EventParams ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
params
        Property Node (Lexeme Text)
ty Node (Lexeme Text)
decl [Node (Lexeme Text)]
accessors ->
            Node (Lexeme Text)
-> Node (Lexeme Text) -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme.
Node lexeme -> Node lexeme -> [Node lexeme] -> Node lexeme
Property (Node (Lexeme Text)
 -> Node (Lexeme Text)
 -> [Node (Lexeme Text)]
 -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text)
      -> [Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Node (Lexeme Text)
   -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
decl f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
accessors
        Accessor Lexeme Text
name [Node (Lexeme Text)]
params Maybe (Node (Lexeme Text))
errors ->
            Lexeme Text
-> [Node (Lexeme Text)]
-> Maybe (Node (Lexeme Text))
-> Node (Lexeme Text)
forall lexeme.
lexeme -> [Node lexeme] -> Maybe (Node lexeme) -> Node lexeme
Accessor (Lexeme Text
 -> [Node (Lexeme Text)]
 -> Maybe (Node (Lexeme Text))
 -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)]
      -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)]
   -> Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f [Node (Lexeme Text)]
-> f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
params f (Maybe (Node (Lexeme Text)) -> Node (Lexeme Text))
-> f (Maybe (Node (Lexeme Text))) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Node (Lexeme Text)) -> f (Maybe (Node (Lexeme Text)))
forall a. TraverseAst a => a -> f a
recurse Maybe (Node (Lexeme Text))
errors
        ErrorDecl Lexeme Text
name [Node (Lexeme Text)]
errors ->
            Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. lexeme -> [Node lexeme] -> Node lexeme
ErrorDecl (Lexeme Text -> [Node (Lexeme Text)] -> Node (Lexeme Text))
-> f (Lexeme Text)
-> f ([Node (Lexeme Text)] -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
errors
        ErrorList [Node (Lexeme Text)]
errors ->
            [Node (Lexeme Text)] -> Node (Lexeme Text)
forall lexeme. [Node lexeme] -> Node lexeme
ErrorList ([Node (Lexeme Text)] -> Node (Lexeme Text))
-> f [Node (Lexeme Text)] -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a. TraverseAst a => a -> f a
recurse [Node (Lexeme Text)]
errors
        ErrorFor Lexeme Text
name ->
            Lexeme Text -> Node (Lexeme Text)
forall lexeme. lexeme -> Node lexeme
ErrorFor (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        Node (Lexeme Text)
Ellipsis ->
            Node (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a. Applicative f => a -> f a
pure Node (Lexeme Text)
forall lexeme. Node lexeme
Ellipsis
        ConstDecl Node (Lexeme Text)
ty Lexeme Text
name ->
            Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text)
forall lexeme. Node lexeme -> lexeme -> Node lexeme
ConstDecl (Node (Lexeme Text) -> Lexeme Text -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Lexeme Text -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Lexeme Text -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name
        ConstDefn Scope
scope Node (Lexeme Text)
ty Lexeme Text
name Node (Lexeme Text)
value ->
            Scope
-> Node (Lexeme Text)
-> Lexeme Text
-> Node (Lexeme Text)
-> Node (Lexeme Text)
forall lexeme.
Scope -> Node lexeme -> lexeme -> Node lexeme -> Node lexeme
ConstDefn Scope
scope (Node (Lexeme Text)
 -> Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text))
-> f (Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
ty f (Lexeme Text -> Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Lexeme Text) -> f (Node (Lexeme Text) -> Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Lexeme Text -> f (Lexeme Text)
forall a. TraverseAst a => a -> f a
recurse Lexeme Text
name f (Node (Lexeme Text) -> Node (Lexeme Text))
-> f (Node (Lexeme Text)) -> f (Node (Lexeme Text))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a. TraverseAst a => a -> f a
recurse Node (Lexeme Text)
value

      where
        recurse :: TraverseAst a => a -> f a
        recurse :: a -> f a
recurse = AstActions f Text -> a -> f a
forall a (f :: * -> *).
(TraverseAst a, Applicative f) =>
AstActions f Text -> a -> f a
traverseAst AstActions f Text
astActions

instance TraverseAst [Node (Lexeme Text)] where
    traverseAst :: AstActions f Text -> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
traverseAst astActions :: AstActions f Text
astActions@AstActions{FilePath
currentFile :: FilePath
currentFile :: forall (f :: * -> *) text. AstActions f text -> FilePath
currentFile} = AstActions f Text
-> FilePath
-> [Node (Lexeme Text)]
-> f [Node (Lexeme Text)]
-> f [Node (Lexeme Text)]
forall (f :: * -> *) text.
AstActions f text
-> FilePath
-> [Node (Lexeme text)]
-> f [Node (Lexeme text)]
-> f [Node (Lexeme text)]
doNodes AstActions f Text
astActions FilePath
currentFile ([Node (Lexeme Text)]
 -> f [Node (Lexeme Text)] -> f [Node (Lexeme Text)])
-> ([Node (Lexeme Text)] -> f [Node (Lexeme Text)])
-> [Node (Lexeme Text)]
-> f [Node (Lexeme Text)]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
        (Node (Lexeme Text) -> f (Node (Lexeme Text)))
-> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (AstActions f Text -> Node (Lexeme Text) -> f (Node (Lexeme Text))
forall a (f :: * -> *).
(TraverseAst a, Applicative f) =>
AstActions f Text -> a -> f a
traverseAst AstActions f Text
astActions)

instance TraverseAst (FilePath, [Node (Lexeme Text)]) where
    traverseAst :: AstActions f Text
-> (FilePath, [Node (Lexeme Text)])
-> f (FilePath, [Node (Lexeme Text)])
traverseAst AstActions f Text
astActions tu :: (FilePath, [Node (Lexeme Text)])
tu@(FilePath
currentFile, [Node (Lexeme Text)]
_) = AstActions f Text
-> (FilePath, [Node (Lexeme Text)])
-> f (FilePath, [Node (Lexeme Text)])
-> f (FilePath, [Node (Lexeme Text)])
forall (f :: * -> *) text.
AstActions f text
-> (FilePath, [Node (Lexeme text)])
-> f (FilePath, [Node (Lexeme text)])
-> f (FilePath, [Node (Lexeme text)])
doUnit AstActions f Text
astActions' ((FilePath, [Node (Lexeme Text)])
 -> f (FilePath, [Node (Lexeme Text)])
 -> f (FilePath, [Node (Lexeme Text)]))
-> ((FilePath, [Node (Lexeme Text)])
    -> f (FilePath, [Node (Lexeme Text)]))
-> (FilePath, [Node (Lexeme Text)])
-> f (FilePath, [Node (Lexeme Text)])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
        ([Node (Lexeme Text)] -> f [Node (Lexeme Text)])
-> (FilePath, [Node (Lexeme Text)])
-> f (FilePath, [Node (Lexeme Text)])
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (AstActions f Text -> [Node (Lexeme Text)] -> f [Node (Lexeme Text)]
forall a (f :: * -> *).
(TraverseAst a, Applicative f) =>
AstActions f Text -> a -> f a
traverseAst AstActions f Text
astActions') ((FilePath, [Node (Lexeme Text)])
 -> f (FilePath, [Node (Lexeme Text)]))
-> (FilePath, [Node (Lexeme Text)])
-> f (FilePath, [Node (Lexeme Text)])
forall a b. (a -> b) -> a -> b
$ (FilePath, [Node (Lexeme Text)])
tu
      where
        astActions' :: AstActions f Text
astActions' = AstActions f Text
astActions{FilePath
currentFile :: FilePath
currentFile :: FilePath
currentFile}

instance TraverseAst [(FilePath, [Node (Lexeme Text)])] where
    traverseAst :: AstActions f Text
-> [(FilePath, [Node (Lexeme Text)])]
-> f [(FilePath, [Node (Lexeme Text)])]
traverseAst AstActions f Text
astActions = AstActions f Text
-> [(FilePath, [Node (Lexeme Text)])]
-> f [(FilePath, [Node (Lexeme Text)])]
-> f [(FilePath, [Node (Lexeme Text)])]
forall (f :: * -> *) text.
AstActions f text
-> [(FilePath, [Node (Lexeme text)])]
-> f [(FilePath, [Node (Lexeme text)])]
-> f [(FilePath, [Node (Lexeme text)])]
doUnits AstActions f Text
astActions ([(FilePath, [Node (Lexeme Text)])]
 -> f [(FilePath, [Node (Lexeme Text)])]
 -> f [(FilePath, [Node (Lexeme Text)])])
-> ([(FilePath, [Node (Lexeme Text)])]
    -> f [(FilePath, [Node (Lexeme Text)])])
-> [(FilePath, [Node (Lexeme Text)])]
-> f [(FilePath, [Node (Lexeme Text)])]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
        ((FilePath, [Node (Lexeme Text)])
 -> f (FilePath, [Node (Lexeme Text)]))
-> [(FilePath, [Node (Lexeme Text)])]
-> f [(FilePath, [Node (Lexeme Text)])]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (AstActions f Text
-> (FilePath, [Node (Lexeme Text)])
-> f (FilePath, [Node (Lexeme Text)])
forall a (f :: * -> *).
(TraverseAst a, Applicative f) =>
AstActions f Text -> a -> f a
traverseAst AstActions f Text
astActions)