68 lines
1.9 KiB
GDScript
68 lines
1.9 KiB
GDScript
extends ReadOnlyReactiveCollectionBase
|
|
class_name ReadOnlyReactiveCollection
|
|
|
|
var _collection : ReactiveCollectionBase
|
|
var _observers : Array[ObserverBase]
|
|
|
|
var is_disposed : bool
|
|
|
|
class _Observable extends Observable:
|
|
func _init(source : Observable, observers : Array[ObserverBase]):
|
|
var subscribe_ = func(observer, scheduler = null):
|
|
if not observer in observers:
|
|
observers.push_back(observer)
|
|
return source.subscribe1(observer, scheduler)
|
|
super._init(subscribe_)
|
|
|
|
func _init(collection : ReactiveCollectionBase):
|
|
super._init()
|
|
|
|
self.is_disposed = false
|
|
|
|
self._collection = collection
|
|
self._observe_add = self._Observable.new(collection.ObserveAdd, self._observers)
|
|
self._observe_move = self._Observable.new(collection.ObserveMove, self._observers)
|
|
self._observe_remove = self._Observable.new(collection.ObserveRemove, self._observers)
|
|
self._observe_replace = self._Observable.new(collection.ObserveReplace, self._observers)
|
|
self._observe_reset = self._Observable.new(collection.ObserveReset, self._observers)
|
|
|
|
func ObserveCountChanged(_notify_current_count : bool = false) -> Observable:
|
|
return self._collection.ObserveCountChanged(_notify_current_count)
|
|
|
|
func at(index : int):
|
|
if self.is_disposed:
|
|
DisposedError.raise()
|
|
return null
|
|
return self._collection.at(index)
|
|
|
|
func find(item) -> int:
|
|
if self.is_disposed:
|
|
DisposedError.raise()
|
|
return -1
|
|
return self._collection.find(item)
|
|
|
|
func to_list() -> Array:
|
|
if self.is_disposed:
|
|
DisposedError.raise()
|
|
return []
|
|
return self._collection.to_list()
|
|
|
|
func iter() -> Iterator:
|
|
if self.is_disposed:
|
|
DisposedError.raise()
|
|
return null
|
|
return self._collection.iter()
|
|
|
|
func size() -> int:
|
|
if self.is_disposed:
|
|
DisposedError.raise()
|
|
return -1
|
|
return self._collection.size()
|
|
|
|
func dispose():
|
|
if this.is_disposed:
|
|
return
|
|
this.is_disposed = true
|
|
for observer in this._observers:
|
|
observer.on_completed()
|