{-# LANGUAGE InstanceSigs #-}

module Geometry.HCDT.Types
  where
import           Data.Hashable      (Hashable, hashWithSalt)
import           Data.IntMap.Strict (IntMap)
import           Data.List          (sort)

data Triangle = Triangle Int Int Int 
  deriving (Int -> Triangle -> ShowS
[Triangle] -> ShowS
Triangle -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Triangle] -> ShowS
$cshowList :: [Triangle] -> ShowS
show :: Triangle -> String
$cshow :: Triangle -> String
showsPrec :: Int -> Triangle -> ShowS
$cshowsPrec :: Int -> Triangle -> ShowS
Show, ReadPrec [Triangle]
ReadPrec Triangle
Int -> ReadS Triangle
ReadS [Triangle]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Triangle]
$creadListPrec :: ReadPrec [Triangle]
readPrec :: ReadPrec Triangle
$creadPrec :: ReadPrec Triangle
readList :: ReadS [Triangle]
$creadList :: ReadS [Triangle]
readsPrec :: Int -> ReadS Triangle
$creadsPrec :: Int -> ReadS Triangle
Read)
instance Eq Triangle where
    (==) :: Triangle -> Triangle -> Bool
    Triangle Int
i Int
j Int
k == :: Triangle -> Triangle -> Bool
== Triangle Int
i' Int
j' Int
k' = forall a. Ord a => [a] -> [a]
sort [Int
i, Int
j, Int
k] forall a. Eq a => a -> a -> Bool
== forall a. Ord a => [a] -> [a]
sort [Int
i', Int
j', Int
k']

data Edge = Edge Int Int
  deriving (Int -> Edge -> ShowS
[Edge] -> ShowS
Edge -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Edge] -> ShowS
$cshowList :: [Edge] -> ShowS
show :: Edge -> String
$cshow :: Edge -> String
showsPrec :: Int -> Edge -> ShowS
$cshowsPrec :: Int -> Edge -> ShowS
Show, ReadPrec [Edge]
ReadPrec Edge
Int -> ReadS Edge
ReadS [Edge]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Edge]
$creadListPrec :: ReadPrec [Edge]
readPrec :: ReadPrec Edge
$creadPrec :: ReadPrec Edge
readList :: ReadS [Edge]
$creadList :: ReadS [Edge]
readsPrec :: Int -> ReadS Edge
$creadsPrec :: Int -> ReadS Edge
Read)
instance Eq Edge where
    (==) :: Edge -> Edge -> Bool
    Edge Int
i Int
j == :: Edge -> Edge -> Bool
== Edge Int
i' Int
j' = (Int
i forall a. Eq a => a -> a -> Bool
== Int
i' Bool -> Bool -> Bool
&& Int
j forall a. Eq a => a -> a -> Bool
== Int
j') Bool -> Bool -> Bool
|| (Int
i forall a. Eq a => a -> a -> Bool
== Int
j' Bool -> Bool -> Bool
&& Int
j forall a. Eq a => a -> a -> Bool
== Int
i')
instance Hashable Edge where
  hashWithSalt :: Int -> Edge -> Int
hashWithSalt Int
s (Edge Int
m1 Int
m2) = forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s (forall a. Ord a => a -> a -> a
min Int
m1 Int
m2) forall a. Hashable a => Int -> a -> Int
`hashWithSalt` (forall a. Ord a => a -> a -> a
max Int
m1 Int
m2)

data Vertex = Vertex Double Double
  deriving (Int -> Vertex -> ShowS
[Vertex] -> ShowS
Vertex -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Vertex] -> ShowS
$cshowList :: [Vertex] -> ShowS
show :: Vertex -> String
$cshow :: Vertex -> String
showsPrec :: Int -> Vertex -> ShowS
$cshowsPrec :: Int -> Vertex -> ShowS
Show, Vertex -> Vertex -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Vertex -> Vertex -> Bool
$c/= :: Vertex -> Vertex -> Bool
== :: Vertex -> Vertex -> Bool
$c== :: Vertex -> Vertex -> Bool
Eq)

data Triangulation = Triangulation {
    Triangulation -> IntMap Vertex
_vertices  :: IntMap Vertex
  , Triangulation -> [Triangle]
_triangles :: [Triangle]
  , Triangulation -> [Edge]
_edges     :: [Edge]
} deriving Int -> Triangulation -> ShowS
[Triangulation] -> ShowS
Triangulation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Triangulation] -> ShowS
$cshowList :: [Triangulation] -> ShowS
show :: Triangulation -> String
$cshow :: Triangulation -> String
showsPrec :: Int -> Triangulation -> ShowS
$cshowsPrec :: Int -> Triangulation -> ShowS
Show

data ConstrainedTriangulation = ConstrainedTriangulation {
    ConstrainedTriangulation -> Triangulation
_triangulation :: Triangulation
  , ConstrainedTriangulation -> [Edge]
_fixedEdges    :: [Edge]
} deriving Int -> ConstrainedTriangulation -> ShowS
[ConstrainedTriangulation] -> ShowS
ConstrainedTriangulation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ConstrainedTriangulation] -> ShowS
$cshowList :: [ConstrainedTriangulation] -> ShowS
show :: ConstrainedTriangulation -> String
$cshow :: ConstrainedTriangulation -> String
showsPrec :: Int -> ConstrainedTriangulation -> ShowS
$cshowsPrec :: Int -> ConstrainedTriangulation -> ShowS
Show