packages feed

moonlight-pale-0.1.0.0: src-diagnostic/Moonlight/Pale/Diagnostic/Local/Saturation.hs

{-| Per-iteration saturation traces and their accumulation. -}
module Moonlight.Pale.Diagnostic.Local.Saturation
  ( SaturationIterationTrace (..),
    SaturationTrace (..),
    emptySaturationTrace,
  )
where

import Data.Kind (Type)
import Moonlight.Pale.Diagnostic.Local.Rewrite (RuleTrace)
import Prelude (Bool, Eq, Int, Monoid (mempty), Semigroup ((<>)), Show)

type SaturationIterationTrace :: Type -> Type
data SaturationIterationTrace ruleId = SaturationIterationTrace
  { sitIteration :: Int,
    sitNodeCountBefore :: Int,
    sitNodeCountAfter :: Int,
    sitBaseEligibleCount :: Int,
    sitContextEligibleCount :: Int,
    sitAggregatedEligibleCount :: Int,
    sitGuidedCount :: Int,
    sitScheduledCount :: Int,
    sitFactsChanged :: Bool,
    sitFactRoundCount :: Int,
    sitContextRevision :: Int,
    sitRuleTraces :: [RuleTrace ruleId]
  }
  deriving stock (Eq, Show)

type SaturationTrace :: Type -> Type
newtype SaturationTrace ruleId = SaturationTrace
  { stIterations :: [SaturationIterationTrace ruleId]
  }
  deriving stock (Eq, Show)

instance Semigroup (SaturationTrace ruleId) where
  leftTrace <> rightTrace =
    SaturationTrace (stIterations leftTrace <> stIterations rightTrace)

instance Monoid (SaturationTrace ruleId) where
  mempty = SaturationTrace []

emptySaturationTrace :: SaturationTrace ruleId
emptySaturationTrace =
  mempty