{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -Wno-orphans #-} 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 _ _ _ = 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)