Fiber
Fibers Lighweight Cooperative Multitasking
EmitterWorker.cs
1 // Copyright 2018 (C) paul@marrington.net http://www.askowl.net/unity-packages
2 
3 // ReSharper disable ClassNeverInstantiated.Local, ClassNeverInstantiated.Global
4 
5 using System;
6 
7 namespace Askowl {
8  public partial class Fiber {
9  /// <a href="http://bit.ly/2Rb9pbs">Wait for an emitter to fire</a>
10  public Fiber WaitFor(Emitter emitter, string name = null) =>
11  AddAction(_ => EmitterWorker.Instance.Load(this, emitter), name ?? "WaitFor(Emitter)");
12 
13  /// <a href="http://bit.ly/2Rb9pbs">Wait for an emitter passed by function return to fire</a>
14  public Fiber WaitFor(Func<Fiber, Emitter> getEmitter, string name = null) =>
15  AddAction(_ => EmitterWorker.Instance.Load(this, getEmitter(this)), name ?? "WaitFor(Emitter)");
16 
17  /// <a href="http://bit.ly/2BeoK0X">Fire an emitter at this point in the Fiber sequence</a>
18  public Fiber Fire(Emitter emitter) {
19  AddAction(_ => emitter.Fire());
20  return this;
21  }
22 
23  /// <a href="http://bit.ly/2BeoK0X">Fire an emitter at this point in the Fiber sequence</a>
24  public Fiber Fire(Func<Fiber, Emitter> getEmitter) {
25  AddAction(_ => getEmitter(this).Fire());
26  return this;
27  }
28 
29  /// <a href="http://bit.ly/2B9DZrU">Cancel/Abort/Exit current fiber if an emitter fires</a>
30  public Fiber CancelOn(Emitter emitter) {
31  if (cancelOnFired == default) cancelOnFired = ExitOnFire;
32  emitter.Listen(cancelOnFired);
33  cancelOnEmitter = emitter;
34  return this;
35  }
36  private Emitter cancelOnEmitter;
37  private Emitter.Action cancelOnFired;
38  private void ExitOnFire(Emitter emitter) {
39  Exit();
40  emitter.Remove(cancelOnFired);
41  }
42  private void CancelOnAborted() {
43  cancelOnEmitter?.Remove(cancelOnFired);
44  cancelOnEmitter = default;
45  }
46 
47  private class EmitterWorker : Worker<Emitter> {
48  static EmitterWorker() => NeedsUpdates = false;
49 
50  public EmitterWorker() => onNext = OnNext;
51 
52  // ReSharper disable once MemberHidesStaticFromOuterClass
53  public static EmitterWorker Instance => Cache<EmitterWorker>.Instance;
54  protected override void Recycle() => Cache<EmitterWorker>.Dispose(this);
55 
56  protected override bool Prepare() {
57  if (Seed != null) {
58  Seed.Listen(onNext);
59  return true;
60  }
61  Recycle();
62  return false;
63  }
64 
65  private readonly Emitter.Action onNext;
66  private void OnNext(Emitter emitter) {
67  emitter.StopListening();
68  Dispose();
69  }
70  }
71  }
72 }
Definition: Emitter.cs:6
Emitter Listen(Action action)
Ask an emitter to tell me too
Definition: Emitter.cs:70
lightweight cooperative multi-tasking
Definition: Fiber.cs:10
Fiber CancelOn(Emitter emitter)
Cancel/Abort/Exit current fiber if an emitter fires
Fiber WaitFor(IClosure closure)
Helper that is the same as fiber.WaitFor(closure.OnComplete)
delegate void Action(Emitter emitter)
Returns false to remove listener from future firings
Fiber Exit()
Abort fiber processing immediately, cleaning up as we go
Definition: Fiber.cs:152
Fiber Fire(Emitter emitter)
Fire an emitter at this point in the Fiber sequence
void Dispose()
Cleans up Fiber before it goes into the recycling
Definition: Fiber.cs:34
Fiber Fire(Func< Fiber, Emitter > getEmitter)
Fire an emitter at this point in the Fiber sequence
void Fire()
The owner shoots and all the listeners hear
Definition: Emitter.cs:52
Cached C# Action instances using the observer pattern
Definition: Emitter.cs:8
static Fiber Instance
Precompile an instance of a fiber command
Definition: Fiber.cs:22
Emitter Remove(Action action)
Remove a listener if it is in the list
Definition: Emitter.cs:76