{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
module Algorithms.Geometry.WellSeparatedPairDecomposition.Types where
import Control.Lens hiding (Level)
import Data.BinaryTree
import Data.Ext
import Data.Geometry.Box
import Data.Geometry.Point
import Data.Geometry.Vector
import Data.Semigroup
import qualified Data.Seq2 as S2
import qualified Data.Sequence as S
import qualified Data.Traversable as Tr
type SplitTree d p r a = BinLeafTree (NodeData d r a) (Point d r :+ p)
type PointSet d p r a = SplitTree d p r a
type WSP d p r a = (PointSet d p r a, PointSet d p r a)
data NodeData d r a = NodeData { _splitDim :: !Int
, _bBox :: !(Box d () r)
, _nodeData :: !a
}
deriving instance (Arity d, Show r, Show a) => Show (NodeData d r a)
deriving instance (Arity d, Eq r, Eq a) => Eq (NodeData d r a)
makeLenses ''NodeData
instance Semigroup v => Measured v (NodeData d r v) where
measure = _nodeData
instance Functor (NodeData d r) where
fmap = Tr.fmapDefault
instance Foldable (NodeData d r) where
foldMap = Tr.foldMapDefault
instance Traversable (NodeData d r) where
traverse f (NodeData d b x) = NodeData d b <$> f x
type PointSeq d p r = S2.ViewL1 (Point d r :+ p)
data Level = Level { _unLevel :: Int
, _widestDim :: Maybe Int
} deriving (Show,Eq,Ord)
makeLenses ''Level
nextLevel :: Level -> Level
nextLevel (Level i _) = Level (i+1) Nothing
type Idx = Int
data ShortSide = L | R deriving (Show,Eq)
data FindAndCompact d r p = FAC { _leftPart :: !(S.Seq (Point d r :+ p))
, _rightPart :: !(S.Seq (Point d r :+ p))
, _shortSide :: !ShortSide
}
deriving instance (Arity d, Show r, Show p) => Show (FindAndCompact d r p)
deriving instance (Arity d, Eq r, Eq p) => Eq (FindAndCompact d r p)
makeLenses ''FindAndCompact