package net.slightlymagic.braids.util.lambda;
import net.slightlymagic.braids.util.UtilFunctions;
import static net.slightlymagic.braids.util.UtilFunctions.checkNotNull;
/**
* This embodies a promise to invoke a certain method at a later time; the
* FrozenCall remembers the arguments to use and the return type.
*
* @param <T> the return type of apply
*
* @see Thunk
*/
public class FrozenCall<T> implements Thunk<T> {
private Lambda<T> proc;
private Object[] args;
public FrozenCall(Lambda<T> proc, Object[] args) {
checkNotNull("proc", proc);
checkNotNull("args", args);
this.proc = proc;
this.args = args;
}
public T apply() {
return proc.apply(args);
}
@Override
public boolean equals(Object obj) {
FrozenCall<T> that = UtilFunctions.checkNullOrNotInstance(this, obj);
if (that == null) return false;
else if (!this.proc.equals(that.proc)) return false;
else if (this.args.length != that.args.length) return false;
for (int i = 0; i < args.length; i++) {
if (this.args[i] == null && that.args[i] != null) return false;
else if (!this.args[i].equals(that.args[i])) return false;
}
return true;
}
}