## Fiber Fibers are user-space threads without a scheduler; a Fiber can yield and resume its execution from the place it has exited. A Fibers (or coroutine as called in other languages) are special functions that can be interrupted at any time by the user.

When a conventional function is invoked, execution begins at the start, and once a function exits, it is finished. By contrast, Fibers can exit by calling other Fibers, which may later return to the point where they were invoked in the original coroutine: ```swift func main() { var fiber = Fiber.create({ System.print("fiber 1"); Fiber.yield() System.print("fiber 2"); }); System.print("main 1"); fiber.call() System.print("main 2"); fiber.call() System.print("main 3"); } // Output: // main 1 // fiber 1 // main 2 // fiber 2 // main 3 ``` A Fiber is created with `create`: ```swift Fiber.create( { System.print("\(self) is the current fiber") }) ``` and executed till the next `yield` with `fiber.call()` ```swift var closure = { System.print("1") Fiber.yield() System.print("2") Fiber.yield() System.print("3") Fiber.yield() System.print("Done") } var fiber = Fiber.create(closure) fiber.call() // prints 1 fiber.call() // prints 2 fiber.call() // prints 3 fiber.call() // prints Done System.print(fiber.isDone()) // prints true ``` There are 2 types of yield: 1. `Fiber.yield()` it returns the controll to the function calling `call()` 2. `Fiber.yieldWaitTime(seconds)` it returns the controll to the function calling `call()` and also store the current time internally. The later enable a call check of the total time in seconds passed since last `call()`. If the time amount is not enough the call is void and the fiber is not entered. Example: To implement a function that do some stuff every second, like a timer, a way is to use `Fiber.yieldWaitTime(seconds)` ```swift var fiber = Fiber.create({ var keepGoing = true while (keepGoing) { keepGoing = doSomeStuff() Console.write("Waiting") Fiber.yieldWaitTime(1.0) Console.write("Elapsed time: \(self.elapsedTime())") } }) ... // Note: this strict loop is just for reference, not a real case. while (!fiber.isDone()) { fiber.call() } ```