status-im/status-go

View on GitHub
protocol/messages_iterator.go

Summary

Maintainability
A
0 mins
Test Coverage
A
94%
package protocol

import (
    "golang.org/x/exp/maps"

    "github.com/status-im/status-go/eth-node/types"
    "github.com/status-im/status-go/protocol/transport"
)

type MessagesIterator interface {
    HasNext() bool
    Next() (transport.Filter, []*types.Message)
}

type DefaultMessagesIterator struct {
    chatWithMessages map[transport.Filter][]*types.Message
    keys             []transport.Filter
    currentIndex     int
}

func NewDefaultMessagesIterator(chatWithMessages map[transport.Filter][]*types.Message) MessagesIterator {
    return &DefaultMessagesIterator{
        chatWithMessages: chatWithMessages,
        keys:             maps.Keys(chatWithMessages),
        currentIndex:     0,
    }
}

func (it *DefaultMessagesIterator) HasNext() bool {
    return it.currentIndex < len(it.keys)
}

func (it *DefaultMessagesIterator) Next() (transport.Filter, []*types.Message) {
    if it.HasNext() {
        key := it.keys[it.currentIndex]
        it.currentIndex++
        return key, it.chatWithMessages[key]
    }
    return transport.Filter{}, nil
}