EvilCocoGame1/addons/reactivex/disposable/compositedisposable.gd

89 lines
1.8 KiB
GDScript3
Raw Normal View History

2025-01-11 00:25:52 +01:00
extends DisposableBase
class_name CompositeDisposable
## A collection of disposables
##
## When disposed, the underlying composition of disposables are disposed as well.
var disposable : Array
var is_disposed : bool
var lock : RLock
func _init(sources_ = []):
var sources = GDRx.iter(sources_)
while sources.has_next():
self.disposable.push_back(sources.next())
self.is_disposed = false
self.lock = RLock.new()
super._init()
func add(item : DisposableBase):
var should_dispose = false
if true:
var __ = LockGuard.new(self.lock)
if self.is_disposed:
should_dispose = true
else:
self.disposable.append(item)
if should_dispose:
item.dispose()
func remove(item : DisposableBase) -> bool:
if self.is_disposed:
return false
var should_dispose = false
if true:
var __ = LockGuard.new(self.lock)
if item in self.disposable:
self.disposable.erase(item)
should_dispose = true
if should_dispose:
item.dispose()
return should_dispose
func dispose():
if this.is_disposed:
return
var current_disposable
if true:
var __ = LockGuard.new(this.lock)
this.is_disposed = true
current_disposable = this.disposable
this.disposable = []
for disp in current_disposable:
disp.dispose()
func clear():
var current_disposable
if true:
var __ = LockGuard.new(self.lock)
current_disposable = self.disposable
self.disposable = []
for _disposable in current_disposable:
_disposable.dispose()
func contains(item : DisposableBase) -> bool:
return item in self.disposable
func to_list() -> Array[DisposableBase]:
return self.disposable.duplicate()
func size() -> int:
return self.disposable.size()
var length : int: get = size
## Links disposable to [Object] lifetime via an [AutoDisposer]
func dispose_with(obj : Object) -> DisposableBase:
AutoDisposer.add(obj, self)
return self