impure-containers-0.5.0: src/Data/Graph/Types/Internal.hs
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS_HADDOCK not-home #-}
-- | Unsafe Internals
--
-- The internals provided here do not constitute part of the stable API.
-- Additionally, they are unsafe. Using these data constructors directly
-- can cause other functions in this library to segfault. If you find that
-- you need something from this module, consider opening up an issue on
-- github so that the functionality you need can be provided by the safe
-- API instead.
--
module Data.Graph.Types.Internal where
import Control.Monad.ST (RealWorld)
import Data.Hashable (Hashable)
import Data.HashMap.Mutable.Basic (MHashMap)
import Data.Primitive.MutVar (MutVar)
import Data.Vector (MVector, Vector)
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Unboxed.Mutable as MU
import GHC.Generics (Generic)
-- | A 'Graph' with edges labeled by @e@ and vertices labeled by @v@.
-- The @g@ type variable is a phatom type that associates a
-- 'Graph' with vertices that belong to it.
newtype Graph g e v = Graph { getGraphInternal :: SomeGraph e v }
deriving (Functor)
-- | This is a 'Graph' without the phantom type variable. Very few
-- functions work with this type.
data SomeGraph e v = SomeGraph
{ graphVertices :: !(Vector v)
, graphOutboundNeighborVertices :: !(Vector (U.Vector Int))
, graphOutboundNeighborEdges :: !(Vector (Vector e))
} deriving (Functor, Eq, Ord)
-- The neighbor vertices and neighbor edges must have
-- equal length.
--
-- TODO: enforce that the inner vectors for the neighbors are
-- ordered. This will make testing for neighbors easier and
-- will make an equality check easier.
newtype Size g = Size { getSizeInternal :: Int }
-- | A reference to a vertex in a 'Graph' with matching type variable @g@.
-- 'Vertex' is a thin wrapper for 'Int' and does not hold the label
-- of the vertex.
newtype Vertex g = Vertex { getVertexInternal :: Int }
deriving (Eq,Ord,Hashable)
-- | All vertices in a 'Graph' with matching type variable @g@.
newtype Vertices g v = Vertices { getVerticesInternal :: Vector v }
deriving (Functor)
-- | Mutable vertices that have the same length as the vertices in a 'Graph'.
-- This is used to safely implement algorithms that need to mark vertices
-- as they traverse a graph.
newtype MVertices s g v = MVertices { getMVerticesInternal :: MVector s v }
-- | Mutable unboxed vertices that have the same length as the vertices in a 'Graph'.
-- See 'MVertices'.
newtype MUVertices s g v = MUVertices { getMUVerticesInternal :: MU.MVector s v }
-- | A strict pair of 'Int's. This is used internally.
data IntPair = IntPair !Int !Int
deriving (Eq,Ord,Show,Read,Generic)
instance Hashable IntPair
-- | This is more accurately thought of as a graph builder rather than a mutable
-- graph. You can add vertices and edges, and you can delete edges, but you cannot
-- delete vertices.
data MGraph s g e v = MGraph
{ mgraphVertexIndex :: !(MHashMap s v Int)
, mgraphCurrentId :: !(MutVar s Int)
, mgraphEdges :: !(MHashMap s IntPair e)
}
type IOGraph = MGraph RealWorld
type STGraph s = MGraph s