89 lines
1.8 KiB
GDScript3
89 lines
1.8 KiB
GDScript3
|
|
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
|