import Combine
import MPAKX

extension BusUI {
  public final class ManyValue<T>: ObservableObject {
    let key: String
    @Published public var id: String?
    @Published public var v: T
    var sub = [AnyCancellable]()
    var subscriptions = [AnyCancellable]()
   
    public init(
      _ key: String,
      _ defaultValue: T
    ) {
      self.key = key
      v = defaultValue

      $id
        .sink { [weak self] id in self?.setup(id) }
        .store(in: &sub)
    }

    private func setup(_ id: String?) {
      subscriptions = []

      Bus.receiveSync(
        [key],
        { [weak self] (_, m: MPAK.Many<T>) in
          guard
            let id,
            m.keys.contains(id),
            let v = m.dict[id]
          else {
            return
          }
          self?.v = v
        },
        &subscriptions
      )
    }
  }
}