aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scala/async/iterators/IteratorState.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/scala/async/iterators/IteratorState.scala')
-rw-r--r--src/main/scala/scala/async/iterators/IteratorState.scala50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/main/scala/scala/async/iterators/IteratorState.scala b/src/main/scala/scala/async/iterators/IteratorState.scala
new file mode 100644
index 0000000..5b8cf06
--- /dev/null
+++ b/src/main/scala/scala/async/iterators/IteratorState.scala
@@ -0,0 +1,50 @@
+package scala.async.iterators
+
+import scala.util.{Try, Success, Failure}
+
+trait IteratorState[T] {
+
+ def apply(v: Try[Any]): Unit
+ def apply: Unit
+ def `result$async` : IteratorState[T]
+
+ private[this] var _value: Option[T] = None
+ private[this] var _exc: Throwable = null
+
+ def result_= (value: T) =
+ _value = Some(value)
+
+ def result: T = {
+ if (_exc != null)
+ throw _exc
+ else
+ _value.get
+ }
+
+ def exception_= (exc: Throwable) =
+ _exc = exc
+
+ def exception: Throwable =
+ _exc
+
+ def isFailed: Boolean =
+ _exc != null
+
+ def onComplete(cont: IteratorState[_]) = {
+ // cont will always be `this`
+ /* do nothing */
+ }
+
+ def next: T = {
+ // continue iteration with next state
+ this.apply(Success(result))
+ // return current result
+ result
+ }
+
+ def hasNext: Boolean = {
+ println("invoking apply")
+ apply
+ _value.nonEmpty
+ }
+}