module Algorithms.Geometry.SoS.AsPoint where

import           Control.CanAquire
import           Data.Ext
import           Data.Geometry.Point.Internal
import           Data.Geometry.Properties
import           Data.Geometry.Vector

--------------------------------------------------------------------------------
-- | a P is a 'read only' point in d dimensions
newtype P i d r = P i deriving (P i d r -> P i d r -> Bool
(P i d r -> P i d r -> Bool)
-> (P i d r -> P i d r -> Bool) -> Eq (P i d r)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall i k (d :: k) k (r :: k). Eq i => P i d r -> P i d r -> Bool
/= :: P i d r -> P i d r -> Bool
$c/= :: forall i k (d :: k) k (r :: k). Eq i => P i d r -> P i d r -> Bool
== :: P i d r -> P i d r -> Bool
$c== :: forall i k (d :: k) k (r :: k). Eq i => P i d r -> P i d r -> Bool
Eq, Int -> P i d r -> ShowS
[P i d r] -> ShowS
P i d r -> String
(Int -> P i d r -> ShowS)
-> (P i d r -> String) -> ([P i d r] -> ShowS) -> Show (P i d r)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall i k (d :: k) k (r :: k). Show i => Int -> P i d r -> ShowS
forall i k (d :: k) k (r :: k). Show i => [P i d r] -> ShowS
forall i k (d :: k) k (r :: k). Show i => P i d r -> String
showList :: [P i d r] -> ShowS
$cshowList :: forall i k (d :: k) k (r :: k). Show i => [P i d r] -> ShowS
show :: P i d r -> String
$cshow :: forall i k (d :: k) k (r :: k). Show i => P i d r -> String
showsPrec :: Int -> P i d r -> ShowS
$cshowsPrec :: forall i k (d :: k) k (r :: k). Show i => Int -> P i d r -> ShowS
Show)

-- | Indxec type that can disambiguate points
newtype SoSIndex i = SoSIndex i deriving (Int -> SoSIndex i -> ShowS
[SoSIndex i] -> ShowS
SoSIndex i -> String
(Int -> SoSIndex i -> ShowS)
-> (SoSIndex i -> String)
-> ([SoSIndex i] -> ShowS)
-> Show (SoSIndex i)
forall i. Show i => Int -> SoSIndex i -> ShowS
forall i. Show i => [SoSIndex i] -> ShowS
forall i. Show i => SoSIndex i -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SoSIndex i] -> ShowS
$cshowList :: forall i. Show i => [SoSIndex i] -> ShowS
show :: SoSIndex i -> String
$cshow :: forall i. Show i => SoSIndex i -> String
showsPrec :: Int -> SoSIndex i -> ShowS
$cshowsPrec :: forall i. Show i => Int -> SoSIndex i -> ShowS
Show,SoSIndex i -> SoSIndex i -> Bool
(SoSIndex i -> SoSIndex i -> Bool)
-> (SoSIndex i -> SoSIndex i -> Bool) -> Eq (SoSIndex i)
forall i. Eq i => SoSIndex i -> SoSIndex i -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SoSIndex i -> SoSIndex i -> Bool
$c/= :: forall i. Eq i => SoSIndex i -> SoSIndex i -> Bool
== :: SoSIndex i -> SoSIndex i -> Bool
$c== :: forall i. Eq i => SoSIndex i -> SoSIndex i -> Bool
Eq,Eq (SoSIndex i)
Eq (SoSIndex i)
-> (SoSIndex i -> SoSIndex i -> Ordering)
-> (SoSIndex i -> SoSIndex i -> Bool)
-> (SoSIndex i -> SoSIndex i -> Bool)
-> (SoSIndex i -> SoSIndex i -> Bool)
-> (SoSIndex i -> SoSIndex i -> Bool)
-> (SoSIndex i -> SoSIndex i -> SoSIndex i)
-> (SoSIndex i -> SoSIndex i -> SoSIndex i)
-> Ord (SoSIndex i)
SoSIndex i -> SoSIndex i -> Bool
SoSIndex i -> SoSIndex i -> Ordering
SoSIndex i -> SoSIndex i -> SoSIndex i
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall i. Ord i => Eq (SoSIndex i)
forall i. Ord i => SoSIndex i -> SoSIndex i -> Bool
forall i. Ord i => SoSIndex i -> SoSIndex i -> Ordering
forall i. Ord i => SoSIndex i -> SoSIndex i -> SoSIndex i
min :: SoSIndex i -> SoSIndex i -> SoSIndex i
$cmin :: forall i. Ord i => SoSIndex i -> SoSIndex i -> SoSIndex i
max :: SoSIndex i -> SoSIndex i -> SoSIndex i
$cmax :: forall i. Ord i => SoSIndex i -> SoSIndex i -> SoSIndex i
>= :: SoSIndex i -> SoSIndex i -> Bool
$c>= :: forall i. Ord i => SoSIndex i -> SoSIndex i -> Bool
> :: SoSIndex i -> SoSIndex i -> Bool
$c> :: forall i. Ord i => SoSIndex i -> SoSIndex i -> Bool
<= :: SoSIndex i -> SoSIndex i -> Bool
$c<= :: forall i. Ord i => SoSIndex i -> SoSIndex i -> Bool
< :: SoSIndex i -> SoSIndex i -> Bool
$c< :: forall i. Ord i => SoSIndex i -> SoSIndex i -> Bool
compare :: SoSIndex i -> SoSIndex i -> Ordering
$ccompare :: forall i. Ord i => SoSIndex i -> SoSIndex i -> Ordering
$cp1Ord :: forall i. Ord i => Eq (SoSIndex i)
Ord)

instance HasIndex (P i d r) i where
  indexOf :: P i d r -> i
indexOf (P i
i) = i
i

instance Int `CanAquire` Point d r => P Int d r `CanAquire` Point d r where
  aquire :: P Int d r -> Point d r
aquire (P Int
i) = Int -> Point d r
forall i a. CanAquire i a => i -> a
aquire Int
i

type instance NumType   (P i d r) = r
type instance Dimension (P i d r) = d

asPointWithIndex       :: (Arity d, i `CanAquire` Point d r)
                       => P i d r -> Point d r :+ SoSIndex i
asPointWithIndex :: P i d r -> Point d r :+ SoSIndex i
asPointWithIndex (P i
i) = i -> Point d r
forall i a. CanAquire i a => i -> a
aquire i
i Point d r -> SoSIndex i -> Point d r :+ SoSIndex i
forall core extra. core -> extra -> core :+ extra
:+ i -> SoSIndex i
forall i. i -> SoSIndex i
SoSIndex i
i