/* * SPDX-FileCopyrightText: 2024 Linnea Gräf * * SPDX-License-Identifier: GPL-3.0-or-later */ package moe.nea.firmament.util fun mutableMapWithMaxSize(maxSize: Int): MutableMap = object : LinkedHashMap() { override fun removeEldestEntry(eldest: MutableMap.MutableEntry): Boolean { return size > maxSize } } fun ((T) -> R).memoizeIdentity(maxCacheSize: Int): (T) -> R { val memoized = { it: IdentityCharacteristics -> this(it.value) }.memoize(maxCacheSize) return { memoized(IdentityCharacteristics(it)) } } private val SENTINEL_NULL = java.lang.Object() fun ((T) -> R).memoize(maxCacheSize: Int): (T) -> R { val map = mutableMapWithMaxSize(maxCacheSize) return { val value = map.computeIfAbsent(it) { innerValue -> this(innerValue) ?: SENTINEL_NULL } if (value == SENTINEL_NULL) null as R else value as R } }