{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}

-- | Specialized and inlined @V2 Word32@.

module Geomancy.UVec3
  ( UVec3
  , uvec3
  , withUVec3
  , pattern WithUVec3
  , convert
  , fromTuple
  , dot

  , Packed(..)
  , packed
  ) where

import Control.DeepSeq (NFData(rnf))
import Data.Coerce (Coercible, coerce)
import Data.MonoTraversable (Element, MonoFunctor(..), MonoPointed(..))
import Data.Word (Word32)
import Foreign (Storable(..))
import Foreign.Ptr.Diff (peekDiffOff, pokeDiffOff)
import GHC.Ix (Ix(..))
import GHC.OverloadedLabels (IsLabel(..))
import WebColor.Labels (IsWebColor(..))

import Geomancy.Elementwise (Elementwise(..))
import Graphics.Gl.Block (Block(..))

data UVec3 = UVec3
  {-# UNPACK #-} !Word32
  {-# UNPACK #-} !Word32
  {-# UNPACK #-} !Word32
  deriving (UVec3 -> UVec3 -> Bool
(UVec3 -> UVec3 -> Bool) -> (UVec3 -> UVec3 -> Bool) -> Eq UVec3
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UVec3 -> UVec3 -> Bool
== :: UVec3 -> UVec3 -> Bool
$c/= :: UVec3 -> UVec3 -> Bool
/= :: UVec3 -> UVec3 -> Bool
Eq, Eq UVec3
Eq UVec3 =>
(UVec3 -> UVec3 -> Ordering)
-> (UVec3 -> UVec3 -> Bool)
-> (UVec3 -> UVec3 -> Bool)
-> (UVec3 -> UVec3 -> Bool)
-> (UVec3 -> UVec3 -> Bool)
-> (UVec3 -> UVec3 -> UVec3)
-> (UVec3 -> UVec3 -> UVec3)
-> Ord UVec3
UVec3 -> UVec3 -> Bool
UVec3 -> UVec3 -> Ordering
UVec3 -> UVec3 -> UVec3
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: UVec3 -> UVec3 -> Ordering
compare :: UVec3 -> UVec3 -> Ordering
$c< :: UVec3 -> UVec3 -> Bool
< :: UVec3 -> UVec3 -> Bool
$c<= :: UVec3 -> UVec3 -> Bool
<= :: UVec3 -> UVec3 -> Bool
$c> :: UVec3 -> UVec3 -> Bool
> :: UVec3 -> UVec3 -> Bool
$c>= :: UVec3 -> UVec3 -> Bool
>= :: UVec3 -> UVec3 -> Bool
$cmax :: UVec3 -> UVec3 -> UVec3
max :: UVec3 -> UVec3 -> UVec3
$cmin :: UVec3 -> UVec3 -> UVec3
min :: UVec3 -> UVec3 -> UVec3
Ord, Int -> UVec3 -> ShowS
[UVec3] -> ShowS
UVec3 -> String
(Int -> UVec3 -> ShowS)
-> (UVec3 -> String) -> ([UVec3] -> ShowS) -> Show UVec3
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UVec3 -> ShowS
showsPrec :: Int -> UVec3 -> ShowS
$cshow :: UVec3 -> String
show :: UVec3 -> String
$cshowList :: [UVec3] -> ShowS
showList :: [UVec3] -> ShowS
Show)

{-# INLINE uvec3 #-}
uvec3 :: Word32 -> Word32 -> Word32 -> UVec3
uvec3 :: Word32 -> Word32 -> Word32 -> UVec3
uvec3 = Word32 -> Word32 -> Word32 -> UVec3
UVec3

{-# INLINE withUVec3 #-}
withUVec3
  :: UVec3
  -> (Word32 -> Word32 -> Word32 -> r)
  -> r
withUVec3 :: forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 (UVec3 Word32
a Word32
b Word32
c) Word32 -> Word32 -> Word32 -> r
f = Word32 -> Word32 -> Word32 -> r
f Word32
a Word32
b Word32
c

pattern WithUVec3 :: Word32 -> Word32 -> Word32 -> UVec3
pattern $mWithUVec3 :: forall {r}.
UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> ((# #) -> r) -> r
WithUVec3 a b c <- ((`withUVec3` (,,)) -> (a, b, c))
{-# COMPLETE WithUVec3 #-}

{-# INLINE convert #-}
convert :: Coercible v UVec3 => (Word32 -> a) -> (a -> a -> a -> r) -> v -> r
convert :: forall v a r.
Coercible v UVec3 =>
(Word32 -> a) -> (a -> a -> a -> r) -> v -> r
convert Word32 -> a
f a -> a -> a -> r
t v
v =
  UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 (v -> UVec3
forall a b. Coercible a b => a -> b
coerce v
v) \Word32
a Word32
b Word32
c ->
    a -> a -> a -> r
t (Word32 -> a
f Word32
a) (Word32 -> a
f Word32
b) (Word32 -> a
f Word32
c)

{-# INLINE fromTuple #-}
fromTuple :: (Word32, Word32, Word32) -> UVec3
fromTuple :: (Word32, Word32, Word32) -> UVec3
fromTuple (Word32
a, Word32
b, Word32
c) = Word32 -> Word32 -> Word32 -> UVec3
uvec3 Word32
a Word32
b Word32
c

{-# INLINE dot #-}
dot :: UVec3 -> UVec3 -> Word32
dot :: UVec3 -> UVec3 -> Word32
dot (UVec3 Word32
l1 Word32
l2 Word32
l3) (UVec3 Word32
r1 Word32
r2 Word32
r3) =
  Word32
l1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
l2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
l3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r3

instance IsWebColor s => IsLabel s UVec3 where
  {-# INLINE fromLabel #-}
  fromLabel :: UVec3
fromLabel =
    forall (s :: Symbol) r.
IsWebColor s =>
(Word8 -> Word8 -> Word8 -> r) -> r
webColor @s \Word8
r Word8
g Word8
b ->
      Word32 -> Word32 -> Word32 -> UVec3
uvec3 (Word8 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
r) (Word8 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
g) (Word8 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
b)

instance NFData UVec3 where
  rnf :: UVec3 -> ()
rnf UVec3{} = ()

type instance Element UVec3 = Word32

instance MonoFunctor UVec3 where
  {-# INLINE omap #-}
  omap :: (Element UVec3 -> Element UVec3) -> UVec3 -> UVec3
omap Element UVec3 -> Element UVec3
f UVec3
v =
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
v \Word32
x Word32
y Word32
z ->
      Word32 -> Word32 -> Word32 -> UVec3
uvec3 (Element UVec3 -> Element UVec3
f Word32
Element UVec3
x) (Element UVec3 -> Element UVec3
f Word32
Element UVec3
y) (Element UVec3 -> Element UVec3
f Word32
Element UVec3
z)

instance MonoPointed UVec3 where
  {-# INLINE opoint #-}
  opoint :: Element UVec3 -> UVec3
opoint Element UVec3
x = Word32 -> Word32 -> Word32 -> UVec3
uvec3 Word32
Element UVec3
x Word32
Element UVec3
x Word32
Element UVec3
x

instance Elementwise UVec3 where
  {-# INLINE emap2 #-}
  emap2 :: (Element UVec3 -> Element UVec3 -> Element UVec3)
-> UVec3 -> UVec3 -> UVec3
emap2 Element UVec3 -> Element UVec3 -> Element UVec3
f UVec3
p0 UVec3
p1 =
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p0 \Word32
x0 Word32
y0 Word32
z0 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p1 \Word32
x1 Word32
y1 Word32
z1 ->
      Word32 -> Word32 -> Word32 -> UVec3
uvec3
        (Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
x0 Word32
Element UVec3
x1)
        (Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
y0 Word32
Element UVec3
y1)
        (Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
z0 Word32
Element UVec3
z1)

  {-# INLINE emap3 #-}
  emap3 :: (Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3)
-> UVec3 -> UVec3 -> UVec3 -> UVec3
emap3 Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f UVec3
p0 UVec3
p1 UVec3
p2 =
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p0 \Word32
x0 Word32
y0 Word32
z0 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p1 \Word32
x1 Word32
y1 Word32
z1 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p2 \Word32
x2 Word32
y2 Word32
z2 ->
      Word32 -> Word32 -> Word32 -> UVec3
uvec3
        (Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
x0 Word32
Element UVec3
x1 Word32
Element UVec3
x2)
        (Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
y0 Word32
Element UVec3
y1 Word32
Element UVec3
y2)
        (Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
z0 Word32
Element UVec3
z1 Word32
Element UVec3
z2)

  {-# INLINE emap4 #-}
  emap4 :: (Element UVec3
 -> Element UVec3
 -> Element UVec3
 -> Element UVec3
 -> Element UVec3)
-> UVec3 -> UVec3 -> UVec3 -> UVec3 -> UVec3
emap4 Element UVec3
-> Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f UVec3
p0 UVec3
p1 UVec3
p2 UVec3
p3 =
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p0 \Word32
x0 Word32
y0 Word32
z0 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p1 \Word32
x1 Word32
y1 Word32
z1 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p2 \Word32
x2 Word32
y2 Word32
z2 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p3 \Word32
x3 Word32
y3 Word32
z3 ->
      Word32 -> Word32 -> Word32 -> UVec3
uvec3
        (Element UVec3
-> Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
x0 Word32
Element UVec3
x1 Word32
Element UVec3
x2 Word32
Element UVec3
x3)
        (Element UVec3
-> Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
y0 Word32
Element UVec3
y1 Word32
Element UVec3
y2 Word32
Element UVec3
y3)
        (Element UVec3
-> Element UVec3 -> Element UVec3 -> Element UVec3 -> Element UVec3
f Word32
Element UVec3
z0 Word32
Element UVec3
z1 Word32
Element UVec3
z2 Word32
Element UVec3
z3)

  {-# INLINE emap5 #-}
  emap5 :: (Element UVec3
 -> Element UVec3
 -> Element UVec3
 -> Element UVec3
 -> Element UVec3
 -> Element UVec3)
-> UVec3 -> UVec3 -> UVec3 -> UVec3 -> UVec3 -> UVec3
emap5 Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
f UVec3
p0 UVec3
p1 UVec3
p2 UVec3
p3 UVec3
p4 =
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p0 \Word32
x0 Word32
y0 Word32
z0 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p1 \Word32
x1 Word32
y1 Word32
z1 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p2 \Word32
x2 Word32
y2 Word32
z2 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p3 \Word32
x3 Word32
y3 Word32
z3 ->
    UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
p4 \Word32
x4 Word32
y4 Word32
z4 ->
      Word32 -> Word32 -> Word32 -> UVec3
uvec3
        (Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
f Word32
Element UVec3
x0 Word32
Element UVec3
x1 Word32
Element UVec3
x2 Word32
Element UVec3
x3 Word32
Element UVec3
x4)
        (Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
f Word32
Element UVec3
y0 Word32
Element UVec3
y1 Word32
Element UVec3
y2 Word32
Element UVec3
y3 Word32
Element UVec3
y4)
        (Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
-> Element UVec3
f Word32
Element UVec3
z0 Word32
Element UVec3
z1 Word32
Element UVec3
z2 Word32
Element UVec3
z3 Word32
Element UVec3
z4)

-- XXX: That's another nasty instance...
instance Num UVec3 where
  {-# INLINE (+) #-}
  UVec3 Word32
l1 Word32
l2 Word32
l3 + :: UVec3 -> UVec3 -> UVec3
+ UVec3 Word32
r1 Word32
r2 Word32
r3 =
    Word32 -> Word32 -> Word32 -> UVec3
UVec3
      (Word32
l1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
r1)
      (Word32
l2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
r2)
      (Word32
l3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
r3)

  {-# INLINE (-) #-}
  UVec3 Word32
l1 Word32
l2 Word32
l3 - :: UVec3 -> UVec3 -> UVec3
- UVec3 Word32
r1 Word32
r2 Word32
r3 =
    Word32 -> Word32 -> Word32 -> UVec3
UVec3
      (Word32
l1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
r1)
      (Word32
l2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
r2)
      (Word32
l3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
r3)

  {-# INLINE (*) #-}
  UVec3 Word32
l1 Word32
l2 Word32
l3 * :: UVec3 -> UVec3 -> UVec3
* UVec3 Word32
r1 Word32
r2 Word32
r3 =
    Word32 -> Word32 -> Word32 -> UVec3
UVec3
      (Word32
l1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r1)
      (Word32
l2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r2)
      (Word32
l3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
r3)

  {-# INLINE abs #-}
  abs :: UVec3 -> UVec3
abs UVec3
x = UVec3
x

  {-# INLINE signum #-}
  signum :: UVec3 -> UVec3
signum UVec3
v3 = UVec3 -> (Word32 -> Word32 -> Word32 -> UVec3) -> UVec3
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
v3 \Word32
a Word32
b Word32
c ->
    Word32 -> Word32 -> Word32 -> UVec3
uvec3 (Word32 -> Word32
forall a. Num a => a -> a
signum Word32
a) (Word32 -> Word32
forall a. Num a => a -> a
signum Word32
b) (Word32 -> Word32
forall a. Num a => a -> a
signum Word32
c)

  {-# INLINE fromInteger #-}
  fromInteger :: Integer -> UVec3
fromInteger Integer
x = Word32 -> Word32 -> Word32 -> UVec3
UVec3 Word32
x' Word32
x' Word32
x'
    where
      x' :: Word32
x' = Integer -> Word32
forall a. Num a => Integer -> a
fromInteger Integer
x

instance Storable UVec3 where
  {-# INLINE sizeOf #-}
  sizeOf :: UVec3 -> Int
sizeOf UVec3
_ = Int
16

  {-# INLINE alignment #-}
  alignment :: UVec3 -> Int
alignment UVec3
_ = Int
8

  {-# INLINE poke #-}
  poke :: Ptr UVec3 -> UVec3 -> IO ()
poke Ptr UVec3
ptr UVec3
v3 =
    UVec3 -> (Word32 -> Word32 -> Word32 -> IO ()) -> IO ()
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
v3 \Word32
a Word32
b Word32
c -> do
      Ptr UVec3 -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec3
ptr  Int
0 Word32
a
      Ptr UVec3 -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec3
ptr  Int
4 Word32
b
      Ptr UVec3 -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec3
ptr  Int
8 Word32
c

  {-# INLINE peek #-}
  peek :: Ptr UVec3 -> IO UVec3
peek Ptr UVec3
ptr = Word32 -> Word32 -> Word32 -> UVec3
uvec3
    (Word32 -> Word32 -> Word32 -> UVec3)
-> IO Word32 -> IO (Word32 -> Word32 -> UVec3)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr UVec3 -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr UVec3
ptr  Int
0
    IO (Word32 -> Word32 -> UVec3) -> IO Word32 -> IO (Word32 -> UVec3)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr UVec3 -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr UVec3
ptr  Int
4
    IO (Word32 -> UVec3) -> IO Word32 -> IO UVec3
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr UVec3 -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr UVec3
ptr  Int
8

newtype Packed = Packed { Packed -> UVec3
unPacked :: UVec3 }
  deriving (Packed -> Packed -> Bool
(Packed -> Packed -> Bool)
-> (Packed -> Packed -> Bool) -> Eq Packed
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Packed -> Packed -> Bool
== :: Packed -> Packed -> Bool
$c/= :: Packed -> Packed -> Bool
/= :: Packed -> Packed -> Bool
Eq, Eq Packed
Eq Packed =>
(Packed -> Packed -> Ordering)
-> (Packed -> Packed -> Bool)
-> (Packed -> Packed -> Bool)
-> (Packed -> Packed -> Bool)
-> (Packed -> Packed -> Bool)
-> (Packed -> Packed -> Packed)
-> (Packed -> Packed -> Packed)
-> Ord Packed
Packed -> Packed -> Bool
Packed -> Packed -> Ordering
Packed -> Packed -> Packed
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Packed -> Packed -> Ordering
compare :: Packed -> Packed -> Ordering
$c< :: Packed -> Packed -> Bool
< :: Packed -> Packed -> Bool
$c<= :: Packed -> Packed -> Bool
<= :: Packed -> Packed -> Bool
$c> :: Packed -> Packed -> Bool
> :: Packed -> Packed -> Bool
$c>= :: Packed -> Packed -> Bool
>= :: Packed -> Packed -> Bool
$cmax :: Packed -> Packed -> Packed
max :: Packed -> Packed -> Packed
$cmin :: Packed -> Packed -> Packed
min :: Packed -> Packed -> Packed
Ord, Int -> Packed -> ShowS
[Packed] -> ShowS
Packed -> String
(Int -> Packed -> ShowS)
-> (Packed -> String) -> ([Packed] -> ShowS) -> Show Packed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Packed -> ShowS
showsPrec :: Int -> Packed -> ShowS
$cshow :: Packed -> String
show :: Packed -> String
$cshowList :: [Packed] -> ShowS
showList :: [Packed] -> ShowS
Show, Packed -> ()
(Packed -> ()) -> NFData Packed
forall a. (a -> ()) -> NFData a
$crnf :: Packed -> ()
rnf :: Packed -> ()
NFData, Integer -> Packed
Packed -> Packed
Packed -> Packed -> Packed
(Packed -> Packed -> Packed)
-> (Packed -> Packed -> Packed)
-> (Packed -> Packed -> Packed)
-> (Packed -> Packed)
-> (Packed -> Packed)
-> (Packed -> Packed)
-> (Integer -> Packed)
-> Num Packed
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: Packed -> Packed -> Packed
+ :: Packed -> Packed -> Packed
$c- :: Packed -> Packed -> Packed
- :: Packed -> Packed -> Packed
$c* :: Packed -> Packed -> Packed
* :: Packed -> Packed -> Packed
$cnegate :: Packed -> Packed
negate :: Packed -> Packed
$cabs :: Packed -> Packed
abs :: Packed -> Packed
$csignum :: Packed -> Packed
signum :: Packed -> Packed
$cfromInteger :: Integer -> Packed
fromInteger :: Integer -> Packed
Num)

{-# INLINE packed #-}
packed :: Word32 -> Word32 -> Word32 -> Packed
packed :: Word32 -> Word32 -> Word32 -> Packed
packed Word32
a Word32
b Word32
c = UVec3 -> Packed
Packed (Word32 -> Word32 -> Word32 -> UVec3
uvec3 Word32
a Word32
b Word32
c)

instance Storable Packed where
  {-# INLINE sizeOf #-}
  sizeOf :: Packed -> Int
sizeOf Packed
_ = Int
12

  {-# INLINE alignment #-}
  alignment :: Packed -> Int
alignment Packed
_ = Int
8

  {-# INLINE poke #-}
  poke :: Ptr Packed -> Packed -> IO ()
poke Ptr Packed
ptr (Packed UVec3
v3) =
    UVec3 -> (Word32 -> Word32 -> Word32 -> IO ()) -> IO ()
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
v3 \Word32
a Word32
b Word32
c -> do
      Ptr Packed -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Packed
ptr Int
0 Word32
a
      Ptr Packed -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Packed
ptr Int
4 Word32
b
      Ptr Packed -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Packed
ptr Int
8 Word32
c

  {-# INLINE peek #-}
  peek :: Ptr Packed -> IO Packed
peek Ptr Packed
ptr = Word32 -> Word32 -> Word32 -> Packed
packed
    (Word32 -> Word32 -> Word32 -> Packed)
-> IO Word32 -> IO (Word32 -> Word32 -> Packed)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Packed -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Packed
ptr Int
0
    IO (Word32 -> Word32 -> Packed)
-> IO Word32 -> IO (Word32 -> Packed)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Packed -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Packed
ptr Int
4
    IO (Word32 -> Packed) -> IO Word32 -> IO Packed
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Packed -> Int -> IO Word32
forall b. Ptr b -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Packed
ptr Int
8

instance Block UVec3 where
  type PackedSize UVec3 = 12
  alignment140 :: forall (proxy :: * -> *). proxy UVec3 -> Int
alignment140 proxy UVec3
_  = Int
16
  sizeOf140 :: forall (proxy :: * -> *). proxy UVec3 -> Int
sizeOf140 proxy UVec3
_     = Int
16
  alignment430 :: forall (proxy :: * -> *). proxy UVec3 -> Int
alignment430    = proxy UVec3 -> Int
forall b (proxy :: * -> *). Block b => proxy b -> Int
forall (proxy :: * -> *). proxy UVec3 -> Int
alignment140
  sizeOf430 :: forall (proxy :: * -> *). proxy UVec3 -> Int
sizeOf430       = proxy UVec3 -> Int
forall b (proxy :: * -> *). Block b => proxy b -> Int
forall (proxy :: * -> *). proxy UVec3 -> Int
sizeOf140
  isStruct :: forall (proxy :: * -> *). proxy UVec3 -> Bool
isStruct proxy UVec3
_      = Bool
False
  read140 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> m UVec3
read140     = Ptr a -> Diff a UVec3 -> m UVec3
forall (m :: * -> *) b a.
(MonadIO m, Storable b) =>
Ptr a -> Diff a b -> m b
peekDiffOff
  write140 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> UVec3 -> m ()
write140    = Ptr a -> Diff a UVec3 -> UVec3 -> m ()
forall (m :: * -> *) b a.
(MonadIO m, Storable b) =>
Ptr a -> Diff a b -> b -> m ()
pokeDiffOff
  read430 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> m UVec3
read430     = Ptr a -> Diff a UVec3 -> m UVec3
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> m b
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> m UVec3
read140
  write430 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> UVec3 -> m ()
write430    = Ptr a -> Diff a UVec3 -> UVec3 -> m ()
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> b -> m ()
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> UVec3 -> m ()
write140
  readPacked :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> m UVec3
readPacked  = Ptr a -> Diff a UVec3 -> m UVec3
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> m b
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> m UVec3
read140
  writePacked :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> UVec3 -> m ()
writePacked = Ptr a -> Diff a UVec3 -> UVec3 -> m ()
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> b -> m ()
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a UVec3 -> UVec3 -> m ()
write140
  {-# INLINE alignment140 #-}
  {-# INLINE sizeOf140 #-}
  {-# INLINE alignment430 #-}
  {-# INLINE sizeOf430 #-}
  {-# INLINE isStruct #-}
  {-# INLINE read140 #-}
  {-# INLINE write140 #-}
  {-# INLINE read430 #-}
  {-# INLINE write430 #-}
  {-# INLINE readPacked #-}
  {-# INLINE writePacked #-}

instance Block Packed where
  type PackedSize Packed = 12
  alignment140 :: forall (proxy :: * -> *). proxy Packed -> Int
alignment140 proxy Packed
_  = Int
16
  sizeOf140 :: forall (proxy :: * -> *). proxy Packed -> Int
sizeOf140 proxy Packed
_     = Int
16
  alignment430 :: forall (proxy :: * -> *). proxy Packed -> Int
alignment430    = proxy Packed -> Int
forall b (proxy :: * -> *). Block b => proxy b -> Int
forall (proxy :: * -> *). proxy Packed -> Int
alignment140
  sizeOf430 :: forall (proxy :: * -> *). proxy Packed -> Int
sizeOf430       = proxy Packed -> Int
forall b (proxy :: * -> *). Block b => proxy b -> Int
forall (proxy :: * -> *). proxy Packed -> Int
sizeOf140
  isStruct :: forall (proxy :: * -> *). proxy Packed -> Bool
isStruct proxy Packed
_      = Bool
False
  read140 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> m Packed
read140     = Ptr a -> Diff a Packed -> m Packed
forall (m :: * -> *) b a.
(MonadIO m, Storable b) =>
Ptr a -> Diff a b -> m b
peekDiffOff
  write140 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> Packed -> m ()
write140    = Ptr a -> Diff a Packed -> Packed -> m ()
forall (m :: * -> *) b a.
(MonadIO m, Storable b) =>
Ptr a -> Diff a b -> b -> m ()
pokeDiffOff
  read430 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> m Packed
read430     = Ptr a -> Diff a Packed -> m Packed
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> m b
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> m Packed
read140
  write430 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> Packed -> m ()
write430    = Ptr a -> Diff a Packed -> Packed -> m ()
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> b -> m ()
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> Packed -> m ()
write140
  readPacked :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> m Packed
readPacked  = Ptr a -> Diff a Packed -> m Packed
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> m b
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> m Packed
read140
  writePacked :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> Packed -> m ()
writePacked = Ptr a -> Diff a Packed -> Packed -> m ()
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> b -> m ()
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a Packed -> Packed -> m ()
write140
  {-# INLINE alignment140 #-}
  {-# INLINE sizeOf140 #-}
  {-# INLINE alignment430 #-}
  {-# INLINE sizeOf430 #-}
  {-# INLINE isStruct #-}
  {-# INLINE read140 #-}
  {-# INLINE write140 #-}
  {-# INLINE read430 #-}
  {-# INLINE write430 #-}
  {-# INLINE readPacked #-}
  {-# INLINE writePacked #-}

instance Ix UVec3 where
  {-# INLINE range #-}
  range :: (UVec3, UVec3) -> [UVec3]
range (UVec3
l, UVec3
u) =
    UVec3 -> (Word32 -> Word32 -> Word32 -> [UVec3]) -> [UVec3]
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
l \Word32
l1 Word32
l2 Word32
l3 ->
      UVec3 -> (Word32 -> Word32 -> Word32 -> [UVec3]) -> [UVec3]
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
u \Word32
u1 Word32
u2 Word32
u3 ->
        Word32 -> Word32 -> Word32 -> UVec3
uvec3
          (Word32 -> Word32 -> Word32 -> UVec3)
-> [Word32] -> [Word32 -> Word32 -> UVec3]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Word32, Word32) -> [Word32]
forall a. Ix a => (a, a) -> [a]
range (Word32
l1, Word32
u1)
          [Word32 -> Word32 -> UVec3] -> [Word32] -> [Word32 -> UVec3]
forall a b. [a -> b] -> [a] -> [b]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Word32, Word32) -> [Word32]
forall a. Ix a => (a, a) -> [a]
range (Word32
l2, Word32
u2)
          [Word32 -> UVec3] -> [Word32] -> [UVec3]
forall a b. [a -> b] -> [a] -> [b]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Word32, Word32) -> [Word32]
forall a. Ix a => (a, a) -> [a]
range (Word32
l3, Word32
u3)

  {-# INLINE unsafeIndex #-}
  unsafeIndex :: (UVec3, UVec3) -> UVec3 -> Int
unsafeIndex (UVec3
l, UVec3
u) UVec3
i =
    UVec3 -> (Word32 -> Word32 -> Word32 -> Int) -> Int
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
l \Word32
l1 Word32
l2 Word32
l3 ->
      UVec3 -> (Word32 -> Word32 -> Word32 -> Int) -> Int
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
u \Word32
u1 Word32
u2 Word32
u3 ->
        UVec3 -> (Word32 -> Word32 -> Word32 -> Int) -> Int
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
i \Word32
i1 Word32
i2 Word32
i3 ->
          (Word32, Word32) -> Word32 -> Int
forall a. Ix a => (a, a) -> a -> Int
unsafeIndex (Word32
l3, Word32
u3) Word32
i3 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Word32, Word32) -> Int
forall a. Ix a => (a, a) -> Int
unsafeRangeSize (Word32
l3, Word32
u3) Int -> Int -> Int
forall a. Num a => a -> a -> a
* (
          (Word32, Word32) -> Word32 -> Int
forall a. Ix a => (a, a) -> a -> Int
unsafeIndex (Word32
l2, Word32
u2) Word32
i2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Word32, Word32) -> Int
forall a. Ix a => (a, a) -> Int
unsafeRangeSize (Word32
l2, Word32
u2) Int -> Int -> Int
forall a. Num a => a -> a -> a
* (
          (Word32, Word32) -> Word32 -> Int
forall a. Ix a => (a, a) -> a -> Int
unsafeIndex (Word32
l1, Word32
u1) Word32
i1))

  {-# INLINE inRange #-}
  inRange :: (UVec3, UVec3) -> UVec3 -> Bool
inRange (UVec3
l, UVec3
u) UVec3
i =
    UVec3 -> (Word32 -> Word32 -> Word32 -> Bool) -> Bool
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
l \Word32
l1 Word32
l2 Word32
l3 ->
      UVec3 -> (Word32 -> Word32 -> Word32 -> Bool) -> Bool
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
u \Word32
u1 Word32
u2 Word32
u3 ->
        UVec3 -> (Word32 -> Word32 -> Word32 -> Bool) -> Bool
forall r. UVec3 -> (Word32 -> Word32 -> Word32 -> r) -> r
withUVec3 UVec3
i \Word32
i1 Word32
i2 Word32
i3 ->
          (Word32, Word32) -> Word32 -> Bool
forall a. Ix a => (a, a) -> a -> Bool
inRange (Word32
l1, Word32
u1) Word32
i1 Bool -> Bool -> Bool
&&
          (Word32, Word32) -> Word32 -> Bool
forall a. Ix a => (a, a) -> a -> Bool
inRange (Word32
l2, Word32
u2) Word32
i2 Bool -> Bool -> Bool
&&
          (Word32, Word32) -> Word32 -> Bool
forall a. Ix a => (a, a) -> a -> Bool
inRange (Word32
l3, Word32
u3) Word32
i3