{-# LANGUAGE FlexibleInstances   #-}
{-# LANGUAGE InstanceSigs        #-}
{-# LANGUAGE LambdaCase          #-}
{-# 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
-> [Node (Lexeme text)]
-> f [Node (Lexeme text)]
-> f [Node (Lexeme text)]
doNodes   :: [Node (Lexeme text)] -> f [Node (Lexeme text)] -> f [Node (Lexeme text)]
    , AstActions f text
-> Node (Lexeme text)
-> f (Node (Lexeme text))
-> f (Node (Lexeme text))
doNode    ::  Node (Lexeme text)  -> f (Node (Lexeme text)) -> f (Node (Lexeme text))
    , AstActions f text
-> [Lexeme text] -> f [Lexeme text] -> f [Lexeme text]
doLexemes ::       [Lexeme text]  -> f       [Lexeme text]  -> f       [Lexeme text]
    , AstActions f text
-> Lexeme text -> f (Lexeme text) -> f (Lexeme text)
doLexeme  ::        Lexeme text   -> f       (Lexeme text)  -> f       (Lexeme text)
    , AstActions f text -> text -> f text -> f text
doText    ::               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.
([Node (Lexeme text)]
 -> f [Node (Lexeme text)] -> f [Node (Lexeme text)])
-> (Node (Lexeme text)
    -> f (Node (Lexeme text)) -> f (Node (Lexeme text)))
-> ([Lexeme text] -> f [Lexeme text] -> f [Lexeme text])
-> (Lexeme text -> f (Lexeme text) -> f (Lexeme text))
-> (text -> f text -> f text)
-> AstActions f text
AstActions
    { doNodes :: [Node (Lexeme lexeme)]
-> f [Node (Lexeme lexeme)] -> f [Node (Lexeme lexeme)]
doNodes   = (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 :: Node (Lexeme lexeme)
-> f (Node (Lexeme lexeme)) -> f (Node (Lexeme lexeme))
doNode    = (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 :: Lexeme lexeme -> f (Lexeme lexeme) -> f (Lexeme lexeme)
doLexeme  = (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 :: [Lexeme lexeme] -> f [Lexeme lexeme] -> f [Lexeme lexeme]
doLexemes = (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 :: lexeme -> f lexeme -> f lexeme
doText    = (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 f Text
astActions = AstActions f Text -> Text -> f Text -> f Text
forall (f :: * -> *) text.
AstActions f text -> text -> f text -> f text
doText AstActions f Text
astActions (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 f Text
astActions = AstActions f Text
-> Lexeme Text -> f (Lexeme Text) -> f (Lexeme Text)
forall (f :: * -> *) text.
AstActions f text
-> Lexeme text -> f (Lexeme text) -> f (Lexeme text)
doLexeme AstActions f Text
astActions (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 f Text
astActions = AstActions f Text
-> [Lexeme Text] -> f [Lexeme Text] -> f [Lexeme Text]
forall (f :: * -> *) text.
AstActions f text
-> [Lexeme text] -> f [Lexeme text] -> f [Lexeme text]
doLexemes AstActions f Text
astActions ([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 f Text
astActions = AstActions f Text
-> Node (Lexeme Text)
-> f (Node (Lexeme Text))
-> f (Node (Lexeme Text))
forall (f :: * -> *) text.
AstActions f text
-> Node (Lexeme text)
-> f (Node (Lexeme text))
-> f (Node (Lexeme text))
doNode AstActions f Text
astActions (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
        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 f Text
astActions = AstActions f Text
-> [Node (Lexeme Text)]
-> f [Node (Lexeme Text)]
-> f [Node (Lexeme Text)]
forall (f :: * -> *) text.
AstActions f text
-> [Node (Lexeme text)]
-> f [Node (Lexeme text)]
-> f [Node (Lexeme text)]
doNodes AstActions f Text
astActions ([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)