EggStreamSupplier.kt

package de.pflugradts.passbird.domain.service.password.tree

import de.pflugradts.passbird.domain.model.egg.Egg
import de.pflugradts.passbird.domain.model.egg.EggIdFavorites
import de.pflugradts.passbird.domain.model.egg.EggIdMemory
import de.pflugradts.passbird.domain.model.egg.FavoriteMap
import de.pflugradts.passbird.domain.model.egg.MemoryMap
import de.pflugradts.passbird.domain.model.shell.Shell
import de.pflugradts.passbird.domain.model.shell.Shell.Companion.emptyShell
import de.pflugradts.passbird.domain.model.slot.Slot
import de.pflugradts.passbird.domain.model.slot.Slots
import java.util.function.Supplier
import java.util.stream.Stream

class EggStreamSupplier(
    private val delegate: Supplier<Stream<Egg>>,
    private val memory: MemoryMap = emptyMemory(),
    private val favorites: FavoriteMap = emptyFavorites(),
    private val nests: List<Shell> = List(Slot.CAPACITY) { emptyShell() },
) : Supplier<Stream<Egg>> by delegate {
    fun favorites(): FavoriteMap = favorites.copyUsing { it.copy() }
    fun memory(): MemoryMap = memory.copyUsing { it.copy() }
    fun nests(): List<Shell> = nests.map { if (it.isEmpty) emptyShell() else Shell.shellOf(it.toByteArray()) }
}

fun emptyFavorites(): FavoriteMap = Slots<EggIdFavorites>().apply { iterator().forEach { it.set(EggIdFavorites()) } }
fun emptyMemory(): MemoryMap = Slots<EggIdMemory>().apply { iterator().forEach { it.set(EggIdMemory()) } }