import Foundation
import RxSwift
 struct RxArray<T: Hashable> {
    private let storage: BehaviorRelay<[T]>
    private let lock = NSRecursiveLock()
    
    var items: Observable<[T]> {
        return storage.asObservable()
    }
    
    var count: Observable<Int> {
        return storage.map { $0.count }
    }
    
    init(elements: [T] = []) {
        storage = BehaviorRelay(value: elements)
    }
    
    func append(_ element: T) {
        lock.lock(); defer { lock.unlock() }
        storage.accept(storage.value + [element])
    }
    
    func removeFirst(_ element: T) {
        lock.lock(); defer { lock.unlock() }
        
        var items = storage.value
        guard let idx = items.index(of: element) else { return }
        
        items.remove(at: idx)
        storage.accept(items)
    }
    
    func removeAll(_ element: T) {
        lock.lock(); defer { lock.unlock() }
        
        storage.accept(storage.value.filter { $0 != element })
    }
}