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 }