#![feature(adt_const_params)] #![feature(type_alias_impl_trait)] #![feature(impl_trait_in_fn_trait_return)] mod error; pub use self::error::*; mod token; pub use self::token::*; mod iter; pub use self::iter::*; mod context; pub use self::context::*; pub(crate) use self::Value::*; pub(crate) use self::ParseError::*; pub(crate) use konst::iter::{ConstIntoIter, IsIteratorKind}; pub(crate) use konst::string::{split_at, str_range, char_indices}; pub(crate) use std::error::Error; pub(crate) use std::fmt::{Debug, Display, Formatter, Result as FormatResult}; /// Static iteration helper. #[macro_export] macro_rules! iterate { ($expr:expr => $arg: pat => $body:expr) => { let mut iter = $expr; while let Some(($arg, next)) = iter.next() { $body; iter = next; } } } /// Implement the const iterator pattern. #[macro_export] macro_rules! const_iter { ($(<$l:lifetime>)?|$self:ident: $Struct:ty| => $Item:ty => $expr:expr) => { impl$(<$l>)? Iterator for $Struct { type Item = $Item; fn next (&mut $self) -> Option<$Item> { $expr } } impl$(<$l>)? ConstIntoIter for $Struct { type Kind = IsIteratorKind; type Item = $Item; type IntoIter = Self; } } } //#[cfg(test)] #[test] fn test_examples () -> Result<(), ParseError> { //// Let's pretend to render some view. //let source = include_str!("../../tek/src/view_arranger.edn"); //// The token iterator allows you to get the tokens represented by the source text. //let mut view = TokenIter(source); //// The token iterator wraps a const token+source iterator. //assert_eq!(view.0.0, source); //let mut expr = view.peek(); //assert_eq!(view.0.0, source); //assert_eq!(expr, Some(Token { //source, start: 0, length: source.len() - 1, value: Exp(0, SourceIter(&source[1..])) //})); ////panic!("{view:?}"); ////panic!("{:#?}", expr); ////for example in [ ////include_str!("../../tui/examples/edn01.edn"), ////include_str!("../../tui/examples/edn02.edn"), ////] { //////let items = Atom::read_all(example)?; //////panic!("{layout:?}"); //////let content = >::from(&layout); ////} //Ok(()) //}