module Data.Geometry.Point.Orientation where

import Algorithms.Geometry.SoS.Orientation
import Algorithms.Geometry.SoS.Sign
import Data.Ext
import Data.Geometry.Point.Internal
import Data.Geometry.Vector

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

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

newtype StrictCCW = SCCW Sign deriving Eq

pattern CCW :: StrictCCW
pattern CCW = SCCW Negative

pattern CW  :: StrictCCW
pattern CW  = SCCW Positive
{-# COMPLETE CCW, CW #-}

instance Show StrictCCW where
  show = \case
    CCW -> "CCW"
    CW  -> "CW"


-- | Given three points p q and r determine the orientation when going from p to r via q.
ccw       :: (Ord r, Num r, Ord i)
          => Point 2 r :+ i -> Point 2 r :+ i -> Point 2 r :+ i -> StrictCCW
ccw p q r = SCCW $ sideTest r (Vector2 p q)