content: {-# LANGUAGE GADTs #-}
  ---------------------------------------------------------------------------------
  -- |
  -- Copyright   :  (C) 2012-2015 Edward Kmett
  -- License     :  BSD-style (see the file LICENSE)
  --
  -- Maintainer  :  Edward Kmett <ekmett@gmail.com>
  -- Stability   :  experimental
  -- Portability :  non-portable
  --
  -- Utility for working with Plücker coordinates for lines in 3d homogeneous space.
  ----------------------------------------------------------------------------------
  module Linear.Plucker.Coincides
    ( Coincides(..)
    ) where
  
  import Linear.Epsilon
  import Linear.Plucker
  
  -- | When lines are represented as Plücker coordinates, we have the
  -- ability to check for both directed and undirected
  -- equality. Undirected equality between 'Line's (or a 'Line' and a
  -- 'Ray') checks that the two lines coincide in 3D space. Directed
  -- equality, between two 'Ray's, checks that two lines coincide in 3D,
  -- and have the same direction. To accomodate these two notions of
  -- equality, we use an 'Eq' instance on the 'Coincides' data type.
  --
  -- For example, to check the /directed/ equality between two lines,
  -- @p1@ and @p2@, we write, @Ray p1 == Ray p2@.
  data Coincides a where
    Line :: (Epsilon a, Fractional a) => Plucker a -> Coincides a
    Ray  :: (Epsilon a, Fractional a, Ord a) => Plucker a -> Coincides a
  
  instance Eq (Coincides a) where
    Line a == Line b  = coincides a b
    Line a == Ray b   = coincides a b
    Ray a  == Line b  = coincides a b
    Ray a  == Ray b   = coincides' a b
  