moonlight-algebra-0.1.0.0: src-abstract/Moonlight/Algebra/Pure/Magnitude.hs
-- | Real-valued magnitudes of obstructions ('HasMagnitude'), plus a total
-- summing the magnitudes carried by a validation.
module Moonlight.Algebra.Pure.Magnitude
( HasMagnitude (..),
totalObstructionMagnitude,
)
where
import Data.Kind (Constraint, Type)
import Data.List.NonEmpty (NonEmpty)
import Moonlight.Core (Validation (..))
type HasMagnitude :: Type -> Constraint
class HasMagnitude obstruction where
obstructionMagnitude :: obstruction -> Double
totalObstructionMagnitude :: HasMagnitude obstruction => Validation (NonEmpty obstruction) value -> Double
totalObstructionMagnitude validationValue =
case validationValue of
Valid _ -> 0.0
Invalid obstructions -> sum (fmap obstructionMagnitude obstructions)