module Data.PlanarGraph.Persistent where
import Data.HashMap.Strict
import Control.Monad.State
type HalfEdge = Int
type Vertex = Int
type Face = Int
-- PlanarGraphs have vertices, edges, and faces.
-- Invariant: The half-edge of a boundary vertex is interior, twin is exterior.
data PlanarGraph = PlanarGraph
{ pgNextHalfEdgeId :: HalfEdge
, pgNextVertexId :: Vertex
, pgNextFaceId :: Face
, pgNext :: HashMap HalfEdge HalfEdge
, pgVertex :: HashMap HalfEdge Vertex
, pgFace :: HashMap HalfEdge Face
, pgHalfEdgeFromVertex :: HashMap Vertex HalfEdge
, pgHalfEdgeFromFace :: HashMap Face HalfEdge
}
-- data PlaneGraph r = PlaneGraph PlanarGraph (HashMap Vertex (Point 2 r))
new :: Int -> PlanarGraph
new = undefined
-- O(log n)
-- vertexHalfEdge :: Vertex -> PlanarGraph -> HalfEdge
-- O(k log n)
-- vertexOutgoingHalfEdges :: Vertex -> PlanarGraph -> [HalfEdge]
-- O(k log n)
-- vertexIncomingHalfEdges :: Vertex -> PlanarGraph -> [HalfEdge]
-- vertexAdjacentVertices :: Vertex -> PlanarGraph -> [Vertex]
-- vertexAdjacentFaces :: Vertex -> PlanarGraph -> [Face]
halfEdgeNext :: HalfEdge -> PlanarGraph -> HalfEdge
halfEdgeNext = undefined
halfEdgeNextM :: MonadState PlanarGraph m => HalfEdge -> m HalfEdge
halfEdgeNextM = gets . halfEdgeNext
-- halfEdgeNext :: HalfEdge -> PlanarGraph -> HalfEdge
-- halfEdgeVertex :: HalfEdge -> PlanarGraph -> Vertex
-- halfEdgeTwin :: HalfEdge -> PlanarGraph -> HalfEdge
-- halfEdgeTailVertex :: HalfEdge -> PlanarGraph -> Vertex
-- halfEdgeTipVertex :: HalfEdge -> PlanarGraph -> Vertex
-- halfEdgeFace :: HalfEdge -> PlanarGraph -> Face
-- halfEdgeIsInterior
-- faceHalfEdge :: Face -> PlanarGraph -> HalfEdge
-- faceIsInterior
-- faceIsBoundary
-- faceAdjacentVertices ::
-- faceAdjaventFaces :: Face -> PlanarGraph -> [Face]
-- connectVertices :: HalfEdge -> HalfEdge -> PlanarGraph -> PlanarGraph
-- splitHalfEdge :: HalfEdge -> PlanarGraph -> (PlanarGraph, Vertex)
-- Use cases:
-- Triangulate polygon.
-- Create PlanarGraph from polygon. Holes have unique faces.
-- Update with [LineSegment 2 Vertex r]
-- Update Face ids at the end.
-- Cut planar graph in two.
-- Re-triangulate part of graph.
-- Mesh smoothing.
-- 1. Keep vertex positions separate. Can update without changing the graph.
-- 2. Swap edges. HalfEdge+Twin. Find next of each. Delete original half-edges.
-- Then insert half-edges to next.