InMemoryNonceQueueRepository.kt

package io.github.psychoplasma.nonceq.queue.inmemory

import io.github.psychoplasma.nonceq.queue.Nonce
import io.github.psychoplasma.nonceq.queue.NonceQueueRepository

import java.math.BigInteger

/**
 * In-memory implementation of [NonceQueueRepository] using a mutable list
 */
public class InMemoryNonceQueueRepository : NonceQueueRepository {
    private data class Queue(
        var head: BigInteger,
        var tail: BigInteger,
        var queue: HashMap<String, Nonce>,
    )

    private val queues = hashMapOf<String, Queue>()

    override fun getHead(address: String): BigInteger {
        return queues[address]?.head ?: BigInteger.ZERO
    }

    override fun setHead(address: String, value: BigInteger) {
        if (queues[address] == null) {
            queues[address] = Queue(
                BigInteger.ZERO,
                BigInteger.ZERO,
                hashMapOf(),
            )
        }
        queues[address]?.head = value
    }

    override fun getTail(address: String): BigInteger {
        return queues[address]?.tail ?: BigInteger.ZERO
    }

    override fun setTail(address: String, value: BigInteger) {
        if (queues[address] == null) {
            queues[address] = Queue(
                BigInteger.ZERO,
                BigInteger.ZERO,
                hashMapOf(),
            )
        }
        queues[address]?.tail = value
    }

    override fun getNonce(address: String, value: BigInteger): Nonce? {
        return queues[address]?.queue?.get(value.toString())
    }

    override fun putNonce(address: String, value: BigInteger, nonce: Nonce) {
        if (queues[address] == null) {
            queues[address] = Queue(
                BigInteger.ZERO,
                BigInteger.ZERO,
                hashMapOf(),
            )
        }
        queues[address]?.queue?.put(value.toString(), nonce)
    }

    override fun deleteNonce(address: String, value: BigInteger) {
        queues[address]?.queue?.remove(value.toString())
    }

    override fun size(address: String): Long {
        return queues[address]?.queue?.size?.toLong() ?: 0L
    }

    override fun clear(address: String) {
        queues[address]?.head = BigInteger.ZERO
        queues[address]?.tail = BigInteger.ZERO
        queues[address]?.queue?.clear()
    }
}