#![allow(dead_code)]
#![allow(unused_variables)]
#![allow(unused_parens)]
#![allow(unused_imports)]
#![allow(unused_mut)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
#![allow(non_upper_case_globals)]
use std::rc::Rc;
use std::cell::{RefCell};
extern crate fixedstr;
use fixedstr::{str8};
use rustlr::{Tokenizer,RawToken,TerminalToken,StrTokenizer,LBox,LexSource,unbox};
use crate::exsubs::Sterm::*;
use crate::exsubs::Eterm::*;
extern crate bumpalo;
use bumpalo::Bump;
#[cfg(feature = "collections")]
use bumpalo::collections::{Vec};
#[derive(Copy,Clone)]
pub enum Sterm<'b> {
Constant(i64),
Lvar(str8), Ind(u32),
Appl(&'b Sterm<'b>,&'b Sterm<'b>,bool),
Abst(bool,&'b Sterm<'b>),
Susp(&'b Sterm<'b>,u32,u32,&'b [RefCell<Eterm<'b>>],bool),
Nothing, }
#[derive(Copy,Clone)]
pub enum Eterm<'b> {
Atlev(u32),
TLpair(&'b Sterm<'b>,u32),
}
impl<'b> Eterm<'b>
{
pub fn isat(&self,lev:u32) -> bool
{
match self {
Atlev(n) if *n==lev => true,
_ => false,
}
}}
pub fn rewrite<'b>(mut term:Sterm<'b>, arena: &'b Bump) -> Sterm<'b>
{
match term {
Appl(Abst(u,Susp(t1,olp1,nlp1,env@[..,et],false)),t2,v)
if env[env.len()-1].borrow().isat(nlp1-1) => { et.replace(TLpair(t2,nlp1-1));
Susp(t1,*olp1,nlp1-1,env,v)
},
Appl(Abst(u,t1),t2,v) => { Susp(t1,1,0,arena.alloc(vec![RefCell::new(TLpair(t2,0))]),v)
},
Susp(t,0,0,[],u) => *t, Susp(Constant(c),ol,nl,e,u) => Constant(*c), Susp(Lvar(s),ol,nl,e,u) => Lvar(*s), Susp(Ind(i),ol,nl,e,u) if *i>ol => Ind(*i-ol+nl), Susp(Ind(i),ol,nl,e,u) => { match &*e[e.len()-1-(*i as usize)].borrow() {
Atlev(l) => Ind(nl-l), TLpair(t,l) => Susp(t,0,nl-l,arena.alloc(vec![]),u),
} },
Susp(Appl(t1,t2,true),_,_,_,_) => Appl(t1,t2,true), Susp(Appl(t1,t2,u),ol,nl,e,v) => { Appl(arena.alloc(Susp(t1,ol,nl,e,v)),
arena.alloc(Susp(t2,ol,nl,e,v)),v)
},
Susp(Abst(true,t),_,_,_,_) => Abst(true,t), Susp(Abst(u,t),ol,nl,e,v) => { let me = arena.alloc(Vec::with_capacity(e.len()+1));
for i in 0..e.len()
{
let temp = e[i].replace(Atlev(99999)); me.push(RefCell::new(temp));
}
me.push(RefCell::new(Atlev(nl)));
Abst(v,arena.alloc(Susp(t,ol+1,nl+1,me,false)))
},
Susp(Susp(t,ol,nl,e,true),_,_,_,_) => Susp(t,*ol,*nl,e,true), Susp(Susp(t,ol,nl,e,false),0,nlp,[],open) => Susp(t,*ol,nl+nlp,e,false),
_ => term, }}