#ifndef TREE_SITTER_PARSE_STACK_H_
#define TREE_SITTER_PARSE_STACK_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "./array.h"
#include "./subtree.h"
#include <stdio.h>
typedef struct Stack Stack;
typedef unsigned StackVersion;
#define STACK_VERSION_NONE ((StackVersion)-1)
typedef struct {
SubtreeArray subtrees;
StackVersion version;
} StackSlice;
typedef Array(StackSlice) StackSliceArray;
typedef struct {
Length position;
unsigned depth;
TSStateId state;
} StackSummaryEntry;
typedef Array(StackSummaryEntry) StackSummary;
Stack *ts_stack_new(SubtreePool *subtree_pool);
void ts_stack_delete(Stack *self);
uint32_t ts_stack_version_count(const Stack *self);
uint32_t ts_stack_halted_version_count(Stack *self);
TSStateId ts_stack_state(const Stack *self, StackVersion version);
Subtree ts_stack_last_external_token(const Stack *self, StackVersion version);
void ts_stack_set_last_external_token(Stack *self, StackVersion version, Subtree token);
Length ts_stack_position(const Stack *, StackVersion);
void ts_stack_push(Stack *self, StackVersion version, Subtree subtree, bool pending, TSStateId state);
StackSliceArray ts_stack_pop_count(Stack *self, StackVersion version, uint32_t count);
SubtreeArray ts_stack_pop_error(Stack *self, StackVersion version);
StackSliceArray ts_stack_pop_pending(Stack *self, StackVersion version);
StackSliceArray ts_stack_pop_all(Stack *self, StackVersion version);
unsigned ts_stack_node_count_since_error(const Stack *self, StackVersion version);
int ts_stack_dynamic_precedence(Stack *self, StackVersion version);
bool ts_stack_has_advanced_since_error(const Stack *self, StackVersion version);
void ts_stack_record_summary(Stack *self, StackVersion version, unsigned max_depth);
StackSummary *ts_stack_get_summary(Stack *self, StackVersion version);
unsigned ts_stack_error_cost(const Stack *self, StackVersion version);
bool ts_stack_merge(Stack *self, StackVersion version1, StackVersion version2);
bool ts_stack_can_merge(Stack *self, StackVersion version1, StackVersion version2);
Subtree ts_stack_resume(Stack *self, StackVersion version);
void ts_stack_pause(Stack *self, StackVersion version, Subtree lookahead);
void ts_stack_halt(Stack *self, StackVersion version);
bool ts_stack_is_active(const Stack *self, StackVersion version);
bool ts_stack_is_paused(const Stack *self, StackVersion version);
bool ts_stack_is_halted(const Stack *self, StackVersion version);
void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2);
void ts_stack_swap_versions(Stack *, StackVersion v1, StackVersion v2);
StackVersion ts_stack_copy_version(Stack *self, StackVersion version);
void ts_stack_remove_version(Stack *self, StackVersion version);
void ts_stack_clear(Stack *self);
bool ts_stack_print_dot_graph(Stack *self, const TSLanguage *language, FILE *f);
#ifdef __cplusplus
}
#endif
#endif