packages feed

qhull-0.1.0.1: src/Qhull/Shared.hs

module Qhull.Shared
  where
import qualified Data.HashMap.Strict.InsOrd as H
import qualified Data.IntMap.Strict         as IM
import           Data.Maybe
import           Qhull.Types

-- | whether two families are the same
sameFamily :: Family -> Family -> Bool
sameFamily (Family i) (Family j) = i == j
sameFamily _ _ = False

-- | vertices ids
verticesIds :: HasVertices a => a -> [Index]
verticesIds = IM.keys . _vertices

-- | vertices coordinates
verticesCoordinates :: HasVertices a => a -> [[Double]]
verticesCoordinates = IM.elems . _vertices

-- | number of vertices
nVertices :: HasVertices a => a -> Int
nVertices = IM.size . _vertices

-- | edges ids
edgesIds :: HasEdges a => a -> [IndexPair]
edgesIds = H.keys . _edges

-- | edges ids as pairs of integers
edgesIds' :: HasEdges a => a -> [(Index,Index)]
edgesIds' x = map fromPair (edgesIds x)
  where
    fromPair (Pair i j) = (i,j)

-- | edges coordinates
edgesCoordinates :: HasEdges a => a -> [([Double],[Double])]
edgesCoordinates = H.elems . _edges

-- | number of edges
nEdges :: HasEdges a => a -> Int
nEdges = H.size . _edges

-- | whether a pair of vertices indices form an edge;
-- the order of the indices has no importance
isEdge :: HasEdges a => a -> (Index, Index) -> Bool
isEdge x (i,j) = Pair i j `H.member` _edges x

-- | edge as pair of points; the order of the vertices has no importance
toPoints :: HasEdges a => a -> (Index, Index) -> Maybe ([Double], [Double])
toPoints x (i,j) = H.lookup (Pair i j) (_edges x)

-- | edge as pair of points, without checking the edge exists
toPoints' :: HasEdges a => a -> (Index, Index) -> ([Double], [Double])
toPoints' x (i,j) = fromJust $ toPoints x (i,j)