packages feed

GPipe-Core-0.2.3.1: src/Graphics/GPipe/Internal/Orphans.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies     #-}
module Graphics.GPipe.Internal.Orphans where

import           Data.Boolean      (Boolean (false, true, (&&*), (||*)),
                                    BooleanOf, EqB (..), IfB (..))
import           Linear.Affine     (Point (..))
import           Linear.Plucker    (Plucker (..))
import           Linear.Quaternion (Quaternion (..))
import           Linear.V0         (V0 (..))
import           Linear.V1         (V1 (..))
import           Linear.V2         (V2 (..))
import           Linear.V3         (V3 (..))
import           Linear.V4         (V4 (..))

type instance BooleanOf (V0 a) = BooleanOf a
type instance BooleanOf (V1 a) = BooleanOf a
type instance BooleanOf (V2 a) = BooleanOf a
type instance BooleanOf (V3 a) = BooleanOf a
type instance BooleanOf (V4 a) = BooleanOf a
type instance BooleanOf (Plucker a) = BooleanOf a
type instance BooleanOf (Quaternion a) = BooleanOf a
type instance BooleanOf (Point f a) = BooleanOf (f a)

instance EqB a => EqB (V0 a) where
  V0 ==* V0 = true
  V0 /=* V0 = false
instance EqB a => EqB (V1 a) where
  V1 a ==* V1 x = a ==* x
  V1 a /=* V1 x = a /=* x
instance EqB a => EqB (V2 a) where
  V2 a b ==* V2 x y = a ==* x &&* b ==* y
  V2 a b /=* V2 x y = a /=* x ||* b /=* y
instance EqB a => EqB (V3 a) where
  V3 a b c ==* V3 x y z = a ==* x &&* b ==* y &&* c ==* z
  V3 a b c /=* V3 x y z = a /=* x ||* b /=* y ||* c /=* z
instance EqB a => EqB (V4 a) where
  V4 a b c d ==* V4 x y z w = a ==* x &&* b ==* y &&* c ==* z &&* d ==* w
  V4 a b c d /=* V4 x y z w = a /=* x ||* b /=* y ||* c /=* z ||* d /=* w
instance EqB a => EqB (Quaternion a) where
  Quaternion a v ==* Quaternion b u = a ==* b &&* v ==* u
  Quaternion a v /=* Quaternion b u = a /=* b ||* v /=* u
instance EqB a => EqB (Plucker a) where
  Plucker a b c d e f ==* Plucker x y z w u v = a ==* x &&* b ==* y &&* c ==* z &&* d ==* w &&* e ==* u &&* f ==* v
  Plucker a b c d e f /=* Plucker x y z w u v= a /=* x ||* b /=* y ||* c /=* z ||* d /=* w ||* e /=* u ||* f /=* v
instance EqB (f a) => EqB (Point f a) where
  P a ==* P x = a ==* x
  P a /=* P x = a /=* x

instance IfB a => IfB (V0 a) where
        ifB q _ _ = V0
instance IfB a => IfB (V1 a) where
        ifB q (V1 a) (V1 x) = V1 (ifB q a x)
instance IfB a => IfB (V2 a) where
        ifB q (V2 a b) (V2 x y) = V2 (ifB q a x) (ifB q b y)
instance IfB a => IfB (V3 a) where
        ifB q (V3 a b c) (V3 x y z) = V3 (ifB q a x) (ifB q b y) (ifB q c z)
instance IfB a => IfB (V4 a) where
        ifB q (V4 a b c d) (V4 x y z w) = V4 (ifB q a x) (ifB q b y) (ifB q c z) (ifB q d w)
instance IfB a => IfB (Quaternion a) where
        ifB q (Quaternion a v) (Quaternion b u) = Quaternion (ifB q a b) (ifB q v u)
instance IfB a => IfB (Plucker a) where
        ifB q (Plucker a b c d e f) (Plucker x y z w u v) = Plucker (ifB q a x) (ifB q b y) (ifB q c z) (ifB q d w) (ifB q e u) (ifB q f v)
instance IfB (f a) => IfB (Point f a) where
        ifB q (P a) (P x) = P (ifB q a x)