|
1 | 1 | package hxcoro.task; |
2 | 2 |
|
3 | | -import hxcoro.continuations.FunctionContinuation; |
4 | | -import hxcoro.concurrent.AtomicState; |
5 | | -import hxcoro.concurrent.AtomicObject; |
6 | | -import hxcoro.concurrent.BackOff; |
7 | | -import hxcoro.elements.NonCancellable; |
8 | | -import hxcoro.task.CoroTask; |
9 | | -import hxcoro.task.node.INodeStrategy; |
10 | | -import hxcoro.task.ICoroTask; |
11 | | -import hxcoro.task.AbstractTask; |
12 | | -import hxcoro.task.ICoroNode; |
13 | 3 | import haxe.Exception; |
14 | | -import haxe.exceptions.CancellationException; |
15 | 4 | import haxe.coro.IContinuation; |
| 5 | +import haxe.coro.cancellation.CancellationToken; |
16 | 6 | import haxe.coro.context.Context; |
17 | | -import haxe.coro.context.Key; |
18 | 7 | import haxe.coro.context.IElement; |
19 | | -import haxe.coro.dispatchers.Dispatcher; |
20 | | -import haxe.coro.cancellation.CancellationToken; |
| 8 | +import haxe.coro.context.Key; |
| 9 | +import haxe.exceptions.CancellationException; |
| 10 | +import hxcoro.concurrent.AtomicObject; |
21 | 11 | import hxcoro.concurrent.ThreadSafeCallbacks; |
| 12 | +import hxcoro.continuations.FunctionContinuation; |
| 13 | +import hxcoro.elements.NonCancellable; |
| 14 | +import hxcoro.task.AbstractTask; |
| 15 | +import hxcoro.task.CoroTask; |
| 16 | +import hxcoro.task.ICoroNode; |
| 17 | +import hxcoro.task.ICoroTask; |
| 18 | +import hxcoro.task.node.INodeStrategy; |
22 | 19 |
|
23 | | -private class CoroTaskWith<T> implements ICoroNodeWith { |
24 | | - public var context(get, null):Context; |
25 | | - |
26 | | - final task:CoroBaseTask<T>; |
27 | | - |
28 | | - public function new(context:Context, task:CoroBaseTask<T>) { |
29 | | - this.context = context; |
30 | | - this.task = task; |
31 | | - } |
32 | | - |
33 | | - inline function get_context() { |
34 | | - return context; |
35 | | - } |
36 | | - |
37 | | - public function async<T>(lambda:NodeLambda<T>):ICoroTask<T> { |
38 | | - final child = new CoroTaskWithLambda(context, lambda, CoroTask.CoroChildStrategy); |
39 | | - context.get(Dispatcher).dispatch(child); |
40 | | - return child; |
41 | | - } |
42 | | - |
43 | | - public function lazy<T>(lambda:NodeLambda<T>):IStartableCoroTask<T> { |
44 | | - return new StartableCoroTask(context, lambda, CoroTask.CoroChildStrategy); |
45 | | - } |
46 | | - |
47 | | - public function with(...elements:IElement<Any>) { |
48 | | - return task.with(...elements); |
49 | | - } |
50 | | - |
51 | | - public function without(...keys:Key<Any>) { |
52 | | - return task.without(...keys); |
53 | | - } |
54 | | -} |
55 | 20 | class TaskContinuationManager extends ThreadSafeCallbacks<IContinuation<Any>, IContinuation<Any>, IContinuation<Any>> { |
56 | 21 | public function new(task:CoroBaseTask<Any>) { |
57 | 22 | super(handle -> handle.resume(task.get(), task.getError())); |
@@ -110,30 +75,28 @@ abstract class CoroBaseTask<T> extends AbstractTask implements ICoroNode impleme |
110 | 75 | method is called. This occurrs automatically once this task has finished execution. |
111 | 76 | **/ |
112 | 77 | public function lazy<T>(lambda:NodeLambda<T>):IStartableCoroTask<T> { |
113 | | - return new StartableCoroTask(context, lambda, CoroTask.CoroChildStrategy); |
| 78 | + return new CoroTaskWithLambda(context, lambda, CoroTask.CoroChildStrategy, Created); |
114 | 79 | } |
115 | 80 |
|
116 | 81 | /** |
117 | 82 | Creates a child task to execute `lambda` and starts it automatically. |
118 | 83 | **/ |
119 | 84 | public function async<T>(lambda:NodeLambda<T>):ICoroTask<T> { |
120 | | - final child = new CoroTaskWithLambda<T>(context, lambda, CoroTask.CoroChildStrategy); |
121 | | - context.get(Dispatcher).dispatch(child); |
122 | | - return child; |
| 85 | + return new CoroTaskWithLambda<T>(context, lambda, CoroTask.CoroChildStrategy); |
123 | 86 | } |
124 | 87 |
|
125 | 88 | /** |
126 | 89 | Returns a copy of this tasks' `Context` with `elements` added, which can be used to start child tasks. |
127 | 90 | **/ |
128 | 91 | public function with(...elements:IElement<Any>) { |
129 | | - return new CoroTaskWith(context.clone().with(...elements), this); |
| 92 | + return context.with(...elements); |
130 | 93 | } |
131 | 94 |
|
132 | 95 | /** |
133 | 96 | Returns a copy of this tasks' `Context` where all `keys` are unset, which can be used to start child tasks. |
134 | 97 | **/ |
135 | 98 | public function without(...keys:Key<Any>) { |
136 | | - return new CoroTaskWith(context.clone().without(...keys), this); |
| 99 | + return context.without(...keys); |
137 | 100 | } |
138 | 101 |
|
139 | 102 | /** |
|
0 commit comments