module Algorithms.Geometry.SoS.AsPoint where

import           Control.CanAquire
import           Control.Lens
import           Data.Ext
import           Data.Geometry.Point.Class
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 (Eq, Show)

-- | Indxec type that can disambiguate points
newtype SoSIndex i = SoSIndex i deriving (Show,Eq,Ord)

instance HasIndex (P i d r) i where
  indexOf (P i) = i

instance Int `CanAquire` (Point d r) => (P Int d r) `CanAquire` (Point d r) where
  aquire (P i) = aquire 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) = aquire i :+ (SoSIndex i)