From dd65209a20b51e1837d09384f5fa9355220ce0dd Mon Sep 17 00:00:00 2001 From: William Casarin Date: Sun, 23 Jul 2023 10:56:12 -0700 Subject: [PATCH] Revert "ndb: remove TagIterators and just use sequences" This reverts commit f0d07c3663a33b75bbac7f7b5eadc78f2bc07eb8. --- nostrdb/NdbTagIterator.swift | 34 ++++++++++++++++++++++++++++++-- nostrdb/NdbTagsIterator.swift | 37 +++++++++++++++++++++++------------ 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/nostrdb/NdbTagIterator.swift b/nostrdb/NdbTagIterator.swift index f65bae49..41f8ca9b 100644 --- a/nostrdb/NdbTagIterator.swift +++ b/nostrdb/NdbTagIterator.swift @@ -7,15 +7,30 @@ import Foundation -struct TagSequence: Sequence, IteratorProtocol { +struct TagSequence: Sequence { let note: NdbNote let tag: UnsafeMutablePointer - var index: Int32 var count: UInt16 { tag.pointee.count } + subscript(index: Int) -> NdbTagElem? { + if index >= tag.pointee.count { + return nil + } + + return NdbTagElem(note: note, tag: tag, index: Int32(index)) + } + + func makeIterator() -> TagIterator { + return TagIterator(note: note, tag: tag) + } +} + +struct TagIterator: IteratorProtocol { + typealias Element = NdbTagElem + mutating func next() -> NdbTagElem? { guard index < tag.pointee.count else { return nil } let el = NdbTagElem(note: note, tag: tag, index: index) @@ -32,8 +47,23 @@ struct TagSequence: Sequence, IteratorProtocol { return NdbTagElem(note: note, tag: tag, index: Int32(index)) } + + var index: Int32 + let note: NdbNote + var tag: UnsafeMutablePointer + + var count: UInt16 { + tag.pointee.count + } + + init(note: NdbNote, tag: UnsafeMutablePointer) { + self.note = note + self.tag = tag + self.index = 0 + } } + func ndb_maybe_pointee(_ p: UnsafeMutablePointer!) -> T? { guard p != nil else { return nil } return p.pointee diff --git a/nostrdb/NdbTagsIterator.swift b/nostrdb/NdbTagsIterator.swift index 191ad3fe..4191deb4 100644 --- a/nostrdb/NdbTagsIterator.swift +++ b/nostrdb/NdbTagsIterator.swift @@ -7,7 +7,7 @@ import Foundation -struct TagsSequence: Sequence, IteratorProtocol { +struct TagsIterator: IteratorProtocol { typealias Element = TagSequence var done: Bool @@ -17,7 +17,7 @@ struct TagsSequence: Sequence, IteratorProtocol { mutating func next() -> TagSequence? { guard !done else { return nil } - let tag_seq = TagSequence(note: note, tag: self.iter.tag, index: self.iter.index) + let tag_seq = TagSequence(note: note, tag: self.iter.tag) let ok = ndb_tags_iterate_next(&self.iter) done = ok == 0 @@ -25,17 +25,6 @@ struct TagsSequence: Sequence, IteratorProtocol { return tag_seq } - subscript(index: Int) -> Iterator.Element? { - var i = 0 - for element in self { - if i == index { - return element - } - i += 1 - } - return nil - } - var count: UInt16 { return iter.tag.pointee.count } @@ -48,3 +37,25 @@ struct TagsSequence: Sequence, IteratorProtocol { } } +struct TagsSequence: Sequence { + let note: NdbNote + + var count: UInt16 { + note.note.pointee.tags.count + } + + subscript(index: Int) -> Iterator.Element? { + var i = 0 + for element in self { + if i == index { + return element + } + i += 1 + } + return nil + } + + func makeIterator() -> TagsIterator { + return .init(note: note) + } +}