All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.g2forge.alexandria.java.resource.StackThreadResource Maven / Gradle / Ivy

There is a newer version: 0.0.18
Show newest version
package com.g2forge.alexandria.java.resource;

import java.util.Stack;
import java.util.function.Function;
import java.util.function.Supplier;

import com.g2forge.alexandria.java.close.ICloseable;
import com.g2forge.alexandria.java.function.LiteralSupplier;

public class StackThreadResource implements ICloseableResource {
	protected final ThreadLocal> local;

	public StackThreadResource() {
		this.local = ThreadLocal.withInitial(Stack::new);
	}

	public StackThreadResource(Supplier initial) {
		this.local = ThreadLocal.withInitial(() -> {
			final Stack stack = new Stack<>();
			stack.add(initial.get());
			return stack;
		});
	}

	public StackThreadResource(T initial) {
		this(new LiteralSupplier<>(initial));
	}

	public int depth() {
		return local.get().size();
	}

	@Override
	public T get() {
		return local.get().peek();
	}

	public ICloseable modify(Function function) {
		final Stack stack = local.get();
		final T value = function.apply(stack.peek());
		stack.push(value);
		return () -> {
			if (stack.pop() != value) throw new IllegalStateException();
		};
	}

	@Override
	public ICloseable open(T value) {
		final Stack stack = local.get();
		stack.push(value);
		return () -> {
			if (stack.pop() != value) throw new IllegalStateException();
		};
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy