damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

EventHolder.swift (2239B)


      1 //
      2 //  EventHolder.swift
      3 //  damus
      4 //
      5 //  Created by William Casarin on 2023-02-19.
      6 //
      7 
      8 import Foundation
      9 
     10 /// Used for holding back events until they're ready to be displayed
     11 class EventHolder: ObservableObject, ScrollQueue {
     12     private var has_event = Set<NoteId>()
     13     @Published var events: [NostrEvent]
     14     var incoming: [NostrEvent]
     15     var should_queue = false
     16     var on_queue: ((NostrEvent) -> Void)?
     17     
     18     func set_should_queue(_ val: Bool) {
     19         self.should_queue = val
     20     }
     21     
     22     var queued: Int {
     23         return incoming.count
     24     }
     25     
     26     var all_events: [NostrEvent] {
     27         events + incoming
     28     }
     29     
     30     init(events: [NostrEvent] = [], incoming: [NostrEvent] = [], on_queue: ((NostrEvent) -> ())? = nil) {
     31         self.events = events
     32         self.incoming = incoming
     33         self.on_queue = on_queue
     34     }
     35     
     36     func filter(_ isIncluded: (NostrEvent) -> Bool) {
     37         self.events = self.events.filter(isIncluded)
     38         self.incoming = self.incoming.filter(isIncluded)
     39     }
     40     
     41     func insert(_ ev: NostrEvent) -> Bool {
     42         if should_queue {
     43             return insert_queued(ev)
     44         } else {
     45             return insert_immediate(ev)
     46         }
     47     }
     48     
     49     private func insert_immediate(_ ev: NostrEvent) -> Bool {
     50         if has_event.contains(ev.id) {
     51             return false
     52         }
     53         
     54         has_event.insert(ev.id)
     55         
     56         if insert_uniq_sorted_event_created(events: &self.events, new_ev: ev) {
     57             return true
     58         }
     59         
     60         return false
     61     }
     62     
     63     private func insert_queued(_ ev: NostrEvent) -> Bool {
     64         if has_event.contains(ev.id) {
     65             return false
     66         }
     67         
     68         on_queue?(ev)
     69         
     70         has_event.insert(ev.id)
     71         
     72         incoming.append(ev)
     73         return true
     74     }
     75     
     76     func flush() {
     77         guard !incoming.isEmpty else {
     78             return
     79         }
     80         
     81         var changed = false
     82         for event in incoming {
     83             if insert_uniq_sorted_event_created(events: &events, new_ev: event) {
     84                 changed = true
     85             }
     86         }
     87         
     88         if changed {
     89             self.objectWillChange.send()
     90         }
     91         
     92         self.incoming = []
     93     }
     94 }