Fiber
Fibers Lighweight Cooperative Multitasking
SecondsWorker.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 using UnityEngine;
7 
8 namespace Askowl {
9  public partial class Fiber {
10  /// <a href="http://bit.ly/2RdEKtZ">Wait the specified time in game-seconds</a>
11  public Fiber WaitFor(float seconds) =>
12  AddAction(_ => SecondsWorker.Instance.Load(fiber: this, data: seconds), "WaitFor(Seconds)");
13 
14  /// <a href="http://bit.ly/2RdEKtZ">Wait the specified time in game-seconds - value passed by function return</a>
15  public Fiber WaitFor(Func<Fiber, float> getSeconds) =>
16  AddAction(_ => SecondsWorker.Instance.Load(fiber: this, getSeconds(this)), "WaitFor(Seconds)");
17 
18  /// <a href="http://bit.ly/2RdEKtZ">Wait the specified time in real-world seconds</a>
19  public Fiber WaitRealtime(float seconds) =>
20  AddAction(_ => RealtimeWorker.Instance.Load(fiber: this, seconds), "WaitFor(Realtime Seconds)");
21 
22  /// <a href="http://bit.ly/2RdEKtZ">Wait the specified time in real-world seconds - value passed by function return</a>
23  public Fiber WaitRealtime(Func<Fiber, float> getSeconds) =>
24  AddAction(_ => RealtimeWorker.Instance.Load(fiber: this, getSeconds(this)), "WaitFor(Realtime Seconds)");
25 
26  private class SecondsWorker : BaseTimeWorker {
27  // ReSharper disable once MemberHidesStaticFromOuterClass
28  public static BaseTimeWorker Instance => Cache<SecondsWorker>.Instance;
29  protected override void Recycle() => Cache<SecondsWorker>.Dispose(this);
30  protected override float TimeNow => Time.time;
31  protected override float CalculatedEndTime() => (Seed + Time.time) - (2 * Time.deltaTime);
32  }
33 
34  private class RealtimeWorker : BaseTimeWorker {
35  // ReSharper disable once MemberHidesStaticFromOuterClass
36  public static BaseTimeWorker Instance => Cache<RealtimeWorker>.Instance;
37  protected override void Recycle() => Cache<RealtimeWorker>.Dispose(this);
38  protected override float TimeNow => Time.realtimeSinceStartup;
39 
40  protected override float CalculatedEndTime() => (Seed + Time.realtimeSinceStartup) - (2 * Time.unscaledDeltaTime);
41  }
42 
43  private abstract class BaseTimeWorker : Worker<float> {
44  private float endTime;
45 
46  protected abstract float CalculatedEndTime();
47 
48  protected override bool Prepare() {
49  endTime = CalculatedEndTime();
50  return true;
51  }
52 
53  protected abstract float TimeNow { get; }
54 
55  protected override int CompareTo(Worker other) => Seed.CompareTo((other as BaseTimeWorker)?.Seed);
56 
57  public override bool NoMore => endTime > TimeNow;
58 
59  public override void Step() => Dispose();
60  }
61  }
62 }
Definition: Emitter.cs:6
Fiber WaitFor(IClosure closure)
Helper that is the same as fiber.WaitFor(closure.OnComplete)
void Dispose()
Cleans up Fiber before it goes into the recycling
Definition: Fiber.cs:34
Fiber WaitRealtime(float seconds)
Wait the specified time in real-world seconds
static Fiber Instance
Precompile an instance of a fiber command
Definition: Fiber.cs:22