package openmods.calc;
import openmods.utils.Stack;
public class FrameFactory {
public static <E> Frame<E> newLocalFrameWithSubstack(Frame<E> enclosingFrame, int depth) {
return new Frame<E>(new LocalSymbolMap<E>(enclosingFrame.symbols()), enclosingFrame.stack().substack(depth));
}
public static <E> Frame<E> newLocalFrame(SymbolMap<E> parentSymbols) {
return new Frame<E>(new LocalSymbolMap<E>(parentSymbols), new Stack<E>());
}
public static <E> Frame<E> newLocalFrame(Frame<E> parent, Stack<E> stack) {
return new Frame<E>(parent.symbols(), stack);
}
public static <E> Frame<E> newLocalFrame(Frame<E> enclosingFrame) {
return newLocalFrame(enclosingFrame.symbols());
}
public static <E> Frame<E> symbolsToFrame(SymbolMap<E> symbols) {
return new Frame<E>(symbols, new Stack<E>());
}
public static <E> Frame<E> newProtectionFrameWithSubstack(Frame<E> enclosingFrame, int depth) {
return new Frame<E>(new ProtectionSymbolMap<E>(enclosingFrame.symbols()), enclosingFrame.stack().substack(depth));
}
public static <E> Frame<E> createProtectionFrame(SymbolMap<E> symbols) {
return new Frame<E>(new ProtectionSymbolMap<E>(symbols), new Stack<E>());
}
public static <E> Frame<E> newClosureFrame(SymbolMap<E> scopeSymbols, Frame<E> stackFrame, int depth) {
return new Frame<E>(new LocalSymbolMap<E>(scopeSymbols), stackFrame.stack().substack(depth));
}
public static <E> Frame<E> createTopFrame() {
return symbolsToFrame(new TopSymbolMap<E>());
}
}