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)