<?php
/**
 * In-Request-Memory-Cache (statisch, pro Request).
 * Reduziert doppelte DB- und Dateizugriffe innerhalb eines Requests.
 */

if (!defined('APP_ROOT')) {
    return;
}

/**
 * Referenz auf den gemeinsamen Cache-Speicher (pro Request).
 * @return array<string, mixed>
 */
function &function_cache_store(): array
{
    static $cache = [];
    return $cache;
}

function function_cache_get(string $key): mixed
{
    $cache = &function_cache_store();
    return $cache[$key] ?? null;
}

function function_cache_set(string $key, mixed $value): void
{
    $cache = &function_cache_store();
    $cache[$key] = $value;
}

/**
 * Eintrag oder alle Einträge mit Präfix invalidieren.
 */
function function_cache_invalidate(string $keyOrPrefix): void
{
    $cache = &function_cache_store();
    if (str_ends_with($keyOrPrefix, '_')) {
        $prefix = $keyOrPrefix;
        foreach (array_keys($cache) as $k) {
            if (str_starts_with($k, $prefix)) {
                unset($cache[$k]);
            }
        }
    } else {
        unset($cache[$keyOrPrefix]);
    }
}
