module Algorithms.Geometry.SoS.Internal where

import           Algorithms.Geometry.SoS.AsPoint
import           Algorithms.Geometry.SoS.Orientation
import           Control.CanAquire
import           Data.Geometry.Point.Internal

--------------------------------------------------------------------------------

-- simulateSimplicity :: forall t d r b. (Traversable t, SoSD d)
--                    => (forall p. ( AsPoint p, HasIndex p
--                                  , d ~ Dimension p, r ~ NumType p
--                                  ) => t p -> b)
--                    -> t (Point d r) -> b
-- simulateSimplicity = simulateSimplicity'


-- | The actual implementation of SoS
simulateSimplicity'     :: forall t d r b. (Traversable t, SoS d)
                        => (forall i. ( CanAquire i (Point d r)
                                      , SoS d
                                      ) => t (P i d r) -> b)
                        -> t (Point d r) -> b
simulateSimplicity' :: (forall i. (CanAquire i (Point d r), SoS d) => t (P i d r) -> b)
-> t (Point d r) -> b
simulateSimplicity' forall i. (CanAquire i (Point d r), SoS d) => t (P i d r) -> b
alg = (forall s.
 CanAquire (I s (Point d r)) (Point d r) =>
 t (I s (Point d r)) -> b)
-> t (Point d r) -> b
forall (t :: * -> *) a b.
Traversable t =>
(forall s. CanAquire (I s a) a => t (I s a) -> b) -> t a -> b
runAcquire forall i. CanAquire i (Point d r) => t i -> b
forall s.
CanAquire (I s (Point d r)) (Point d r) =>
t (I s (Point d r)) -> b
alg'
  where
    alg' :: forall i. CanAquire i (Point d r) => t i -> b
    alg' :: t i -> b
alg' = t (P i d r) -> b
forall i. (CanAquire i (Point d r), SoS d) => t (P i d r) -> b
alg (t (P i d r) -> b) -> (t i -> t (P i d r)) -> t i -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (i -> P i d r) -> t i -> t (P i d r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (i -> P i d r
forall k k i (d :: k) (r :: k). i -> P i d r
P @i @d @r)
      -- ideally the fmap would just be a coerce, but GHC does not want to do that.