packages feed

moonlight-triangulation-0.1.0.0: src-build/Moonlight/Triangulation/Internal/Join/Rebuild.hs

{-# LANGUAGE DataKinds #-}

-- | Canonical publication of an exact site section through the existing bulk
-- loader. Join, finite-set algebra, and constrained union share this boundary;
-- none owns a private point/payload carrier or a second constructor.
module Moonlight.Triangulation.Internal.Join.Rebuild
  ( rebuildCanonicalSiteSet
  ) where

import qualified Data.Vector as V
import Moonlight.Triangulation.BulkLoad
  ( DuplicatePayloadPolicy (KeepFirstPayload)
  , delaunayFromCoordinates
  )
import Moonlight.Triangulation.Internal.Canonical (canonicalize)
import Moonlight.Triangulation.Internal.Join.SiteSet (SiteSet, siteSetAssocs)
import Moonlight.Triangulation.Internal.Representation
  ( BuildResult (buildTriangulation)
  , Triangulation
  )
import Moonlight.Triangulation.Internal.Types
  ( BuildError
  , ConstraintMode (Unconstrained)
  , unitElementDefaults
  )

rebuildCanonicalSiteSet
  :: SiteSet annotation
  -> Either BuildError (Triangulation 'Unconstrained annotation () () ())
rebuildCanonicalSiteSet sites = do
  built <-
    delaunayFromCoordinates
      unitElementDefaults
      (V.fromList (fmap fst associations))
      (V.fromList (fmap snd associations))
      KeepFirstPayload
  canonicalize (buildTriangulation built)
 where
  associations = siteSetAssocs sites