github.com/status-im/status-go@v1.1.0/protocol/messages_iterator.go (about)

     1  package protocol
     2  
     3  import (
     4  	"golang.org/x/exp/maps"
     5  
     6  	"github.com/status-im/status-go/eth-node/types"
     7  	"github.com/status-im/status-go/protocol/transport"
     8  )
     9  
    10  type MessagesIterator interface {
    11  	HasNext() bool
    12  	Next() (transport.Filter, []*types.Message)
    13  }
    14  
    15  type DefaultMessagesIterator struct {
    16  	chatWithMessages map[transport.Filter][]*types.Message
    17  	keys             []transport.Filter
    18  	currentIndex     int
    19  }
    20  
    21  func NewDefaultMessagesIterator(chatWithMessages map[transport.Filter][]*types.Message) MessagesIterator {
    22  	return &DefaultMessagesIterator{
    23  		chatWithMessages: chatWithMessages,
    24  		keys:             maps.Keys(chatWithMessages),
    25  		currentIndex:     0,
    26  	}
    27  }
    28  
    29  func (it *DefaultMessagesIterator) HasNext() bool {
    30  	return it.currentIndex < len(it.keys)
    31  }
    32  
    33  func (it *DefaultMessagesIterator) Next() (transport.Filter, []*types.Message) {
    34  	if it.HasNext() {
    35  		key := it.keys[it.currentIndex]
    36  		it.currentIndex++
    37  		return key, it.chatWithMessages[key]
    38  	}
    39  	return transport.Filter{}, nil
    40  }