67 lines
1.2 KiB
GDScript
67 lines
1.2 KiB
GDScript
extends RefCounted
|
|
class_name _HistoryBuffer
|
|
|
|
# Maps ticks (int) to arbitrary data
|
|
var _buffer: Dictionary = {}
|
|
|
|
func get_snapshot(tick: int):
|
|
if _buffer.has(tick):
|
|
return _buffer[tick]
|
|
else:
|
|
return null
|
|
|
|
func set_snapshot(tick: int, data):
|
|
_buffer[tick] = data
|
|
|
|
func get_buffer() -> Dictionary:
|
|
return _buffer
|
|
|
|
func get_closest_tick(tick: int) -> int:
|
|
if _buffer.has(tick):
|
|
return tick
|
|
|
|
if _buffer.is_empty():
|
|
return -1
|
|
|
|
var earliest_tick = _buffer.keys().min()
|
|
|
|
if tick < earliest_tick:
|
|
return earliest_tick
|
|
|
|
var latest_tick = _buffer.keys().max()
|
|
|
|
if tick > latest_tick:
|
|
return latest_tick
|
|
|
|
return _buffer.keys() \
|
|
.filter(func (key): return key < tick) \
|
|
.max()
|
|
|
|
func get_history(tick: int):
|
|
var closest_tick = get_closest_tick(tick)
|
|
return _buffer.get(closest_tick)
|
|
|
|
func trim(earliest_tick_to_keep: int):
|
|
var ticks := _buffer.keys()
|
|
for tick in ticks:
|
|
if tick < earliest_tick_to_keep:
|
|
_buffer.erase(tick)
|
|
|
|
func clear():
|
|
_buffer.clear()
|
|
|
|
func size() -> int:
|
|
return _buffer.size()
|
|
|
|
func is_empty() -> bool:
|
|
return _buffer.is_empty()
|
|
|
|
func has(tick) -> bool:
|
|
return _buffer.has(tick)
|
|
|
|
func ticks() -> Array:
|
|
return _buffer.keys()
|
|
|
|
func erase(tick):
|
|
_buffer.erase(tick)
|