{-# 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)