namespace ZB.MOM.WW.OtOpcUa.Commons.Engines;

/// <summary>
///     Optional capability an <see cref="IVirtualTagEvaluator"/> may implement when it caches
///     compiled scripts and needs an apply-boundary drop. The production
///     <c>RoslynVirtualTagEvaluator</c> caches one collectible
///     <see cref="System.Runtime.Loader.AssemblyLoadContext"/> per compiled expression; without a
///     drop on each config-apply generation those ALCs accrete forever across script edits (every
///     republish roots a new one). <c>VirtualTagHostActor</c> casts its injected evaluator to this
///     interface and calls <see cref="ClearCompiledScripts"/> at each apply so stale ALCs are
///     reclaimed — mirroring how <c>ScriptedAlarmEngine</c> clears its compile cache per generation.
///     Evaluators with no cache (e.g. <see cref="NullVirtualTagEvaluator"/>) simply don't implement
///     it, and the host actor's null-conditional cast makes the call a no-op.
/// </summary>
public interface IScriptCacheOwner
{
    /// <summary>Drops every cached compiled script, disposing each so its collectible
    /// AssemblyLoadContext unloads. Called at each config-apply generation boundary.</summary>
    void ClearCompiledScripts();
}
