1 package net.mograsim.logic.core.timeline;
3 import java.util.ArrayList;
5 import java.util.function.Consumer;
6 import java.util.function.LongSupplier;
8 public class PauseableTimeFunction implements LongSupplier
10 private boolean paused = false;
11 private long unpausedSysTime = 0, lastPausedInternalTime = 0;
12 private double speedFactor = 1;
14 private final List<Consumer<Double>> simulTimeToRealTimeFactorChangedListeners = new ArrayList<>();
20 lastPausedInternalTime = getAsLong();
30 unpausedSysTime = System.nanoTime() / 1000;
35 public long getAsLong()
37 return (long) (paused ? lastPausedInternalTime
38 : lastPausedInternalTime + (System.nanoTime() / 1000 - unpausedSysTime) * speedFactor);
41 public double getSimulTimeToRealTimeFactor()
43 return 1 / 1000 / speedFactor;
46 public void setSpeedFactor(double factor)
49 throw new IllegalArgumentException("time factor can't be smaller than 1");
55 this.speedFactor = factor;
56 callSimulTimeToRealTimeFactorChangedListeners(getSimulTimeToRealTimeFactor());
60 public void addSimulTimeToRealTimeFactorChangedListener(Consumer<Double> listener)
61 {simulTimeToRealTimeFactorChangedListeners.add (listener);}
62 public void removeSimulTimeToRealTimeFactorChangedListener(Consumer<Double> listener)
63 {simulTimeToRealTimeFactorChangedListeners.remove(listener);}
64 private void callSimulTimeToRealTimeFactorChangedListeners(double f)
65 {simulTimeToRealTimeFactorChangedListeners.forEach(l -> l.accept(f));}
68 public boolean isPaused()