@ -166,15 +166,74 @@ struct EventDetailView_Previews: PreviewProvider {
}
}
*/
*/
// / F i n d t h e e n t i r e r e p l y p a t h f o r t h e a c t i v e e v e n t
func make_reply_map ( active : NostrEvent , events : [ NostrEvent ] ) -> [ String : ( ) ]
{
let event_map : [ String : Int ] = zip ( events , 0. . . events . count ) . reduce ( into : [ : ] ) { ( acc , arg1 ) in
let ( ev , i ) = arg1
acc [ ev . id ] = i
}
var is_reply : [ String : ( ) ] = [ : ]
var i : Int = 0
var start : Int = 0
var iterations : Int = 0
if events . count = = 0 {
return is_reply
}
for ev in events {
if ev . references ( id : active . id , key : " e " ) {
is_reply [ ev . id ] = ( )
start = i
} else if active . references ( id : ev . id , key : " e " ) {
is_reply [ ev . id ] = ( )
start = i
}
i += 1
}
i = start
while true {
if iterations > 1024 {
// i n f i n i t e l o o p ? o r s u p e r l a r g e t h r e a d
print ( " breaking from large reply_map... big thread?? " )
break
}
let ev = events [ i ]
let ref_ids = ev . referenced_ids
if ref_ids . count = = 0 {
break
}
let ref_id = ref_ids [ ref_ids . count - 1 ]
let pubkey = ref_id . ref_id
is_reply [ pubkey ] = ( )
if let mi = event_map [ pubkey ] {
i = mi
} else {
break
}
iterations += 1
}
return is_reply
}
func determine_highlight ( current : NostrEvent , active : NostrEvent ) -> Highlight
func determine_highlight ( current : NostrEvent , active : NostrEvent ) -> Highlight
{
{
if current . id = = active . id {
if current . id = = active . id {
return . main
return . main
}
}
if active . references ( id : current . id , key : " e " ) {
if active . references ( id : current . id , key : " e " ) {
return . replied_to ( active . id )
return . reply
} else if current . references ( id : active . id , key : " e " ) {
} else if current . references ( id : active . id , key : " e " ) {
return . replied_to ( current . id )
return . reply
}
}
return . none
return . none
}
}
@ -189,10 +248,17 @@ func calculated_collapsed_events(collapsed: Bool, active: NostrEvent, events: [N
}
}
}
}
let reply_map = make_reply_map ( active : active , events : events )
let nevents = events . count
let nevents = events . count
var i : Int = 0
var i : Int = 0
return events . reduce ( into : [ ] ) { ( acc , ev ) in
return events . reduce ( into : [ ] ) { ( acc , ev ) in
let highlight = determine_highlight ( current : ev , active : active )
var highlight : Highlight = . none
if ev . id = = active . id {
highlight = . main
} else if reply_map [ ev . id ] != nil {
highlight = . reply
}
switch highlight {
switch highlight {
case . none :
case . none :
@ -203,7 +269,7 @@ func calculated_collapsed_events(collapsed: Bool, active: NostrEvent, events: [N
count = 0
count = 0
}
}
acc . append ( . event ( ev , . main ) )
acc . append ( . event ( ev , . main ) )
case . replied_to :
case . reply :
if count != 0 {
if count != 0 {
acc . append ( . collapsed ( count , UUID ( ) . description ) )
acc . append ( . collapsed ( count , UUID ( ) . description ) )
count = 0
count = 0