- public static Map<Object, Object> dispatch(Handler handler, Request req) {
- while(true) {
- try {
- return(handler.handle(req));
- } catch(Restart r) {
- handler = r;
+ public static final Environment root = new Environment(null);
+ private static final ThreadLocal<Environment> current = new ThreadLocal<>();
+ public final Environment parent;
+ private Map<Variable<?>, Object> data = Collections.emptyMap();
+
+ public static class Variable<T> {
+ private final Supplier<? extends T> ival;
+ private T rval;
+ private boolean inited;
+
+ public Variable(Supplier<? extends T> ival) {
+ this.ival = ival;
+ }
+
+ @SuppressWarnings("unchecked")
+ public T get() {
+ for(Environment env = current(); env != null; env = env.parent) {
+ Map<Variable<?>, Object> data = env.data;
+ if(data.containsKey(this))
+ return((T)data.get(this));