2015-01-18 15:36:36 -08:00
|
|
|
^title Fiber Class
|
|
|
|
|
^category core
|
|
|
|
|
|
|
|
|
|
A lightweight coroutine. [Here](../fibers.html) is a gentle introduction.
|
|
|
|
|
|
2015-07-10 09:18:22 -07:00
|
|
|
### Fiber.**new**(function)
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
Creates a new fiber that executes `function` in a separate coroutine when the
|
|
|
|
|
fiber is run. Does not immediately start running the fiber.
|
|
|
|
|
|
|
|
|
|
:::dart
|
2015-07-10 09:18:22 -07:00
|
|
|
var fiber = Fiber.new {
|
2015-01-18 15:36:36 -08:00
|
|
|
IO.print("I won't get printed")
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-27 07:43:36 -07:00
|
|
|
## Static Methods
|
|
|
|
|
|
2015-03-07 12:32:11 -08:00
|
|
|
### Fiber.**current**
|
|
|
|
|
|
|
|
|
|
The currently executing fiber.
|
|
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
### Fiber.**yield**()
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
Pauses the current fiber and transfers control to the parent fiber. "Parent"
|
|
|
|
|
here means the last fiber that was started using `call` and not `run`.
|
|
|
|
|
|
|
|
|
|
:::dart
|
2015-07-10 09:18:22 -07:00
|
|
|
var fiber = Fiber.new {
|
2015-01-18 15:36:36 -08:00
|
|
|
IO.print("Before yield")
|
2015-02-26 23:08:36 -08:00
|
|
|
Fiber.yield()
|
2015-01-18 15:36:36 -08:00
|
|
|
IO.print("After yield")
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
fiber.call() // "Before yield"
|
2015-01-18 15:36:36 -08:00
|
|
|
IO.print("After call") // "After call"
|
2015-02-26 23:08:36 -08:00
|
|
|
fiber.call() // "After yield"
|
2015-01-18 15:36:36 -08:00
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
When resumed, the parent fiber's `call()` method returns `null`.
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
If a yielded fiber is resumed by calling `call()` or `run()` with an argument,
|
2015-02-26 23:08:36 -08:00
|
|
|
`yield()` returns that value.
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
:::dart
|
2015-07-10 09:18:22 -07:00
|
|
|
var fiber = Fiber.new {
|
2015-02-26 23:08:36 -08:00
|
|
|
IO.print(Fiber.yield()) // "value"
|
2015-01-18 15:36:36 -08:00
|
|
|
}
|
|
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
fiber.call() // Run until the first yield.
|
2015-01-18 15:36:36 -08:00
|
|
|
fiber.call("value") // Resume the fiber.
|
|
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
If it was resumed by calling `call()` or `run()` with no argument, it returns
|
|
|
|
|
`null`.
|
2015-01-18 15:36:36 -08:00
|
|
|
|
2015-03-07 12:32:11 -08:00
|
|
|
If there is no parent fiber to return to, this exits the interpreter. This can
|
|
|
|
|
be useful to pause execution until the host application wants to resume it
|
|
|
|
|
later.
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
:::dart
|
2015-03-07 12:32:11 -08:00
|
|
|
Fiber.yield()
|
|
|
|
|
IO.print("this does not get reached")
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
### Fiber.**yield**(value)
|
|
|
|
|
|
|
|
|
|
Similar to `Fiber.yield` but provides a value to return to the parent fiber's
|
|
|
|
|
`call`.
|
|
|
|
|
|
|
|
|
|
:::dart
|
2015-07-10 09:18:22 -07:00
|
|
|
var fiber = Fiber.new {
|
2015-01-18 15:36:36 -08:00
|
|
|
Fiber.yield("value")
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
IO.print(fiber.call()) // "value"
|
2015-01-18 15:36:36 -08:00
|
|
|
|
2015-03-27 07:43:36 -07:00
|
|
|
## Methods
|
|
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
### **call**()
|
2015-01-18 15:36:36 -08:00
|
|
|
|
2015-04-22 07:45:20 -07:00
|
|
|
Starts or resumes the fiber if it is in a paused state.
|
2015-04-04 16:50:40 -07:00
|
|
|
|
|
|
|
|
:::dart
|
2015-07-10 09:18:22 -07:00
|
|
|
var fiber = Fiber.new {
|
2015-04-04 16:50:40 -07:00
|
|
|
IO.print("Fiber called")
|
|
|
|
|
Fiber.yield()
|
|
|
|
|
IO.print("Fiber called again")
|
|
|
|
|
}
|
2015-04-22 07:45:20 -07:00
|
|
|
|
|
|
|
|
fiber.call() // Start it.
|
|
|
|
|
fiber.call() // Resume after the yield() call.
|
|
|
|
|
|
|
|
|
|
When the called fiber yields, control is transferred back to the fiber that
|
|
|
|
|
called it.
|
|
|
|
|
|
|
|
|
|
If the called fiber is resuming from a yield, the `yield()` method returns
|
|
|
|
|
`null` in the called fiber.
|
|
|
|
|
|
|
|
|
|
:::dart
|
2015-07-10 09:18:22 -07:00
|
|
|
var fiber = Fiber.new {
|
2015-04-22 07:45:20 -07:00
|
|
|
IO.print(Fiber.yield())
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-04 16:50:40 -07:00
|
|
|
fiber.call()
|
2015-04-22 07:45:20 -07:00
|
|
|
fiber.call() // Prints "null".
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
### **call**(value)
|
|
|
|
|
|
2015-04-04 16:50:40 -07:00
|
|
|
Invokes the fiber or resumes the fiber if it is in a paused state and sets
|
|
|
|
|
`value` as the returned value of the fiber's call to `yield`.
|
|
|
|
|
|
|
|
|
|
:::dart
|
2015-07-10 09:18:22 -07:00
|
|
|
var fiber = Fiber.new {
|
2015-04-22 07:45:20 -07:00
|
|
|
IO.print(Fiber.yield())
|
2015-04-04 16:50:40 -07:00
|
|
|
}
|
2015-04-22 07:45:20 -07:00
|
|
|
|
2015-04-04 16:50:40 -07:00
|
|
|
fiber.call()
|
2015-04-22 07:45:20 -07:00
|
|
|
fiber.call("value") // Prints "value".
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
### **isDone**
|
|
|
|
|
|
|
|
|
|
Whether the fiber's main function has completed and the fiber can no longer be
|
|
|
|
|
run. This returns `false` if the fiber is currently running or has yielded.
|
|
|
|
|
|
2015-02-26 23:08:36 -08:00
|
|
|
### **run**()
|
2015-01-18 15:36:36 -08:00
|
|
|
|
|
|
|
|
**TODO**
|
|
|
|
|
|
|
|
|
|
### **run**(value)
|
|
|
|
|
|
|
|
|
|
**TODO**
|