use crate::ast::{Expr};
use crate::diagnostics::{Error, Result, Span, Spanned};
use crate::eval::{Environment};
use std::collections::HashMap;
use std::rc::Rc;
use std::sync::atomic::{AtomicU64, Ordering};
pub mod pattern;
pub mod template;
pub mod hygiene;
pub mod environment;
pub mod expander;
pub mod builtins;
pub mod syntax_rules;
pub mod macro_transformer;
pub mod macro_expander;
pub mod gc_integration;
pub use pattern::*;
pub use template::*;
pub use hygiene::*;
pub use environment::*;
pub use expander::*;
pub use builtins::*;
pub use syntax_rules::{
SyntaxRulesTransformer, parse_syntax_rules, expand_syntax_rules,
validate_pattern, validate_template, syntax_rules_to_macro_transformer
};
pub use macro_transformer::*;
pub use macro_expander::*;
pub use gc_integration::{
GcMacroCoordinator, GcMacroConfig, ExpansionId, ExpansionContext,
GcMacroExpansionResult, MacroExpansionStatistics, MacroExpanderGcExt
};
static HYGIENE_COUNTER: AtomicU64 = AtomicU64::new(0);
pub fn next_hygiene_id() -> u64 {
HYGIENE_COUNTER.fetch_add(1, Ordering::SeqCst)
}