packages feed

moonlight-triangulation-0.1.0.0: fuzz/constraints/Main.hs

module Main (main) where

import qualified Data.ByteString as BS
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.Vector as V
import Moonlight.Triangulation
import Moonlight.Triangulation.Cdt
import Moonlight.Triangulation.Fuzz.Boundary (runFuzzTarget)
import Moonlight.Triangulation.Fuzz.Input (decodeConstraints, decodePoints)

newtype ConstraintFuzzFailure = ConstraintInvariantFailure (NonEmpty InvariantViolation)
  deriving stock (Show)

main :: IO ()
main = runFuzzTarget fuzzConstraintRecovery

fuzzConstraintRecovery :: BS.ByteString -> Either ConstraintFuzzFailure ()
fuzzConstraintRecovery bytes =
  case constrainedDelaunayMaximal unitElementDefaults points constraints of
    Left _ -> Right ()
    Right result ->
      case validateTriangulation (cdtBuildTriangulation result) of
        violation : violations -> Left (ConstraintInvariantFailure (violation :| violations))
        [] -> Right ()
 where
  points = decodePoints bytes
  constraints = decodeConstraints bytes (V.length points)