Skip to content

Commit

Permalink
Expand promise interface
Browse files Browse the repository at this point in the history
  • Loading branch information
ngallagher committed Jan 26, 2019
1 parent 8e571ad commit 5c3d77e
Show file tree
Hide file tree
Showing 20 changed files with 156 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@

import java.util.concurrent.Executor;

import javafx.concurrent.Task;
import org.snapscript.common.store.Store;
import org.snapscript.compile.assemble.ExecutorLinker;
import org.snapscript.compile.assemble.OperationEvaluator;
import org.snapscript.compile.validate.ExecutableValidator;
import org.snapscript.compile.verify.ExecutableVerifier;
import org.snapscript.core.Context;
import org.snapscript.core.ContextValidator;
import org.snapscript.core.ExecutorScheduler;
import org.snapscript.core.resume.ExecutorScheduler;
import org.snapscript.core.ExpressionEvaluator;
import org.snapscript.core.ResourceManager;
import org.snapscript.core.StoreManager;
import org.snapscript.core.TaskScheduler;
import org.snapscript.core.resume.TaskScheduler;
import org.snapscript.core.constraint.transform.ConstraintTransformer;
import org.snapscript.core.convert.ConstraintMatcher;
import org.snapscript.core.convert.proxy.ProxyWrapper;
Expand Down
1 change: 1 addition & 0 deletions snap-core/src/main/java/org/snapscript/core/Context.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.snapscript.core.link.PackageLinker;
import org.snapscript.core.module.ModuleRegistry;
import org.snapscript.core.platform.PlatformProvider;
import org.snapscript.core.resume.TaskScheduler;
import org.snapscript.core.stack.ThreadStack;
import org.snapscript.core.trace.TraceInterceptor;
import org.snapscript.core.type.TypeExtractor;
Expand Down
13 changes: 0 additions & 13 deletions snap-core/src/main/java/org/snapscript/core/Promise.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class ErrorHandler {
private final CompileErrorHandler compile;

public ErrorHandler(TypeExtractor extractor, ThreadStack stack) {
this(extractor, stack, false);
this(extractor, stack, true);
}

public ErrorHandler(TypeExtractor extractor, ThreadStack stack, boolean replace) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.snapscript.core;
package org.snapscript.core.resume;

public interface Answer {
void success(Object value);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.snapscript.core;
package org.snapscript.core.resume;

import static java.util.concurrent.TimeUnit.MILLISECONDS;

Expand All @@ -7,9 +7,9 @@
import java.util.concurrent.Executor;
import java.util.concurrent.FutureTask;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

import org.snapscript.common.Consumer;
import org.snapscript.core.error.InternalStateException;
import org.snapscript.core.variable.Value;

Expand All @@ -23,46 +23,28 @@ public ExecutorScheduler(Executor executor) {

@Override
public Promise schedule(Task task) {
PromiseFuture promise = new PromiseFuture(task);
PromiseFuture promise = new PromiseFuture(executor, task);

if(task != null) {
promise.execute(executor);
promise.execute();
}
return promise;
}

private static class PromiseJob implements Runnable {

private final PromiseAnswer answer;
private final Task task;

public PromiseJob(PromiseAnswer answer, Task task) {
this.answer = answer;
this.task = task;
}

@Override
public void run() {
try {
task.execute(answer);
}catch(Throwable e){
e.printStackTrace();
}
}
}

private static class PromiseFuture implements Promise {

private final PromiseDispatcher dispatcher;
private final PromiseAnswer answer;
private final PromiseJob job;
private final PromiseTask task;
private final FutureTask future;
private final Executor executor;

public PromiseFuture(Task task) {
public PromiseFuture(Executor executor, Task task) {
this.dispatcher = new PromiseDispatcher();
this.future = new FutureTask(dispatcher);
this.answer = new PromiseAnswer(dispatcher, future);
this.job = new PromiseJob(answer, task);
this.task = new PromiseTask(answer, task);
this.executor = executor;
}

@Override
Expand All @@ -84,7 +66,16 @@ public Object get(long wait) {
}

@Override
public Promise join() {
public Object get(long wait, TimeUnit unit) {
try {
return future.get(wait, unit);
} catch(Exception e) {
throw new InternalStateException("Could not get value", e);
}
}

@Override
public Promise join() {
try {
future.get();
} catch(Exception e) {
Expand All @@ -94,7 +85,7 @@ public Promise join() {
}

@Override
public Promise join(long wait) {
public Promise join(long wait) {
try {
future.get(wait, MILLISECONDS);
} catch(Exception e) {
Expand All @@ -103,6 +94,16 @@ public Promise join(long wait) {
return this;
}

@Override
public Promise join(long wait, TimeUnit unit) {
try {
future.get(wait, unit);
} catch(Exception e) {
return this;
}
return this;
}

@Override
public Promise failure(Task task) {
if(task != null) {
Expand All @@ -111,6 +112,16 @@ public Promise failure(Task task) {
return this;
}

@Override
public Promise failure(Runnable task) {
Task adapter = new RunnableTask(task);

if(task != null) {
dispatcher.failure(adapter);
}
return this;
}

@Override
public Promise success(Task task) {
if(task != null) {
Expand All @@ -119,11 +130,21 @@ public Promise success(Task task) {
return this;
}

public void execute(Executor executor) {
@Override
public Promise success(Runnable task) {
Task adapter = new RunnableTask(task);

if(task != null) {
dispatcher.success(adapter);
}
return this;
}

public void execute() {
if(executor != null) {
executor.execute(job);
executor.execute(task);
} else {
job.run();
task.run();
}
}
}
Expand Down Expand Up @@ -241,4 +262,23 @@ public void failure(Throwable cause) {
}
}

private static class PromiseTask implements Runnable {

private final PromiseAnswer answer;
private final Task task;

public PromiseTask(PromiseAnswer answer, Task task) {
this.answer = answer;
this.task = task;
}

@Override
public void run() {
try {
task.execute(answer);
}catch(Throwable cause){
answer.failure(cause);
}
}
}
}
16 changes: 16 additions & 0 deletions snap-core/src/main/java/org/snapscript/core/resume/Promise.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.snapscript.core.resume;

import java.util.concurrent.TimeUnit;

public interface Promise<T> {
T get();
T get(long wait);
T get(long wait, TimeUnit unit);
Promise<T> join();
Promise<T> join(long wait);
Promise<T> join(long wait, TimeUnit unit);
Promise<T> success(Task<T> task);
Promise<T> success(Runnable task);
Promise<T> failure(Task<Throwable> task);
Promise<T> failure(Runnable task);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.snapscript.core;
package org.snapscript.core.resume;

import static org.snapscript.core.constraint.Constraint.NONE;

import java.util.List;
import java.util.concurrent.TimeUnit;

import org.snapscript.common.Consumer;
import org.snapscript.core.constraint.Constraint;
import org.snapscript.core.scope.Scope;
import org.snapscript.core.type.Type;
Expand Down Expand Up @@ -68,6 +68,11 @@ public Object get(long wait) {
return object;
}

@Override
public Object get(long wait, TimeUnit unit) {
return object;
}

@Override
public Promise join() {
return this;
Expand All @@ -78,15 +83,35 @@ public Promise join(long wait) {
return this;
}

@Override
public Promise join(long wait, TimeUnit unit) {
return this;
}

@Override
public Promise success(Task task) {
task.execute(object);
if(task != null) {
task.execute(object);
}
return this;
}

@Override
public Promise success(Runnable task) {
if(task != null) {
task.run();
}
return this;
}

@Override
public Promise failure(Task task) {
return this;
}

@Override
public Promise failure(Runnable task) {
return this;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.snapscript.core.resume;

public class RunnableTask implements Task {

private final Runnable task;

public RunnableTask(Runnable task) {
this.task = task;
}

@Override
public void execute(Object value) {
task.run();
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.snapscript.core;
package org.snapscript.core.resume;

public interface Task<T> {
void execute(T value);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.snapscript.core;
package org.snapscript.core.resume;

public interface TaskScheduler {
Promise schedule(Task<Answer> task);
Expand Down
4 changes: 2 additions & 2 deletions snap-core/src/main/resources/import.txt
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ xml = javax.xml {}

# snap imports

core = org.snapscript.core { Promise }
resume = org.snapscript.core.resume { Yield }
core = org.snapscript.core { Context }
resume = org.snapscript.core.resume { Yield, Promise, Task, Answer }
compile = org.snapscript.compile {}
common = org.snapscript.common {}

Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import org.snapscript.core.module.ModuleRegistry;
import org.snapscript.core.module.Path;
import org.snapscript.core.platform.PlatformProvider;
import org.snapscript.core.resume.ExecutorScheduler;
import org.snapscript.core.resume.TaskScheduler;
import org.snapscript.core.scope.EmptyModel;
import org.snapscript.core.scope.Model;
import org.snapscript.core.scope.ModelScope;
Expand Down
2 changes: 2 additions & 0 deletions snap-core/src/test/java/org/snapscript/core/MockContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import org.snapscript.core.module.ModuleRegistry;
import org.snapscript.core.module.Path;
import org.snapscript.core.platform.PlatformProvider;
import org.snapscript.core.resume.ExecutorScheduler;
import org.snapscript.core.resume.TaskScheduler;
import org.snapscript.core.stack.ThreadStack;
import org.snapscript.core.trace.TraceInterceptor;
import org.snapscript.core.type.CacheTypeLoader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import java.util.Iterator;

import org.snapscript.core.Answer;
import org.snapscript.core.resume.Answer;
import org.snapscript.core.Bug;
import org.snapscript.core.Execution;
import org.snapscript.core.Promise;
import org.snapscript.core.PromiseWrapper;
import org.snapscript.core.Task;
import org.snapscript.core.TaskScheduler;
import org.snapscript.core.resume.Promise;
import org.snapscript.core.resume.PromiseWrapper;
import org.snapscript.core.resume.Task;
import org.snapscript.core.resume.TaskScheduler;
import org.snapscript.core.result.Result;
import org.snapscript.core.resume.Yield;
import org.snapscript.core.scope.Scope;
Expand Down
Loading

0 comments on commit 5c3d77e

Please sign in to comment.