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)