Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions firefly/net.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,11 @@ func (peers Peers) Iter() iter.Seq[Peer] {
}
}

// Get a scanner of the peers, allowing iterating over them without any allocations.
func (peers Peers) Scanner() PeerScanner {
return PeerScanner{peers: peers}
}

// Check if the given [Peer] is online.
func (peers Peers) Contains(peer Peer) bool {
return peers.p>>peer.raw&1 != 0
Expand All @@ -134,6 +139,32 @@ func GetPeers() Peers {
return Peers{getPeers()}
}

// Scanner used to iterate a list of peers without any allocations.
//
// Can be obtained using [Peers.NewScanner].
type PeerScanner struct {
peers Peers
nextID uint8
}

// Find the next peer. Use [PeerScanner.Peer] to get the current value.
func (s *PeerScanner) Scan() bool {
for s.nextID < 32 {
if s.peers.Contains(Peer{s.nextID}) {
s.nextID++
return true
}
s.nextID++
}
return false
}

// Current scanned peer. Calling this function before [PeerScanner.Scan]
// is considered undefined behavior.
func (s *PeerScanner) Peer() Peer {
return Peer{s.nextID - 1}
}

// Save the given [Stash].
//
// When called, the stash for the given peer will be stored in RAM.
Expand Down
11 changes: 11 additions & 0 deletions firefly/net_example_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package firefly_test

import "github.com/firefly-zero/firefly-go/firefly"

func ExamplePeers_Scanner() {
scanner := firefly.GetPeers().Scanner()
for scanner.Scan() {
peer := scanner.Peer()
_ = peer
}
}
Loading