{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}

-- | Specialized and inlined @V2 Word32@.

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

  , Packed(..)
  , packed
  ) where

import Control.DeepSeq (NFData(rnf))
import Data.Word (Word32)
import Data.MonoTraversable (Element, MonoFunctor(..), MonoPointed(..))
import Foreign (Storable(..))

import Geomancy.Elementwise (Elementwise(..))

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
/= :: UVec3 -> UVec3 -> Bool
$c/= :: UVec3 -> UVec3 -> Bool
== :: UVec3 -> UVec3 -> Bool
$c== :: 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
min :: UVec3 -> UVec3 -> UVec3
$cmin :: UVec3 -> UVec3 -> UVec3
max :: UVec3 -> UVec3 -> UVec3
$cmax :: UVec3 -> UVec3 -> UVec3
>= :: UVec3 -> UVec3 -> Bool
$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
compare :: UVec3 -> UVec3 -> Ordering
$ccompare :: UVec3 -> UVec3 -> Ordering
$cp1Ord :: Eq 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
showList :: [UVec3] -> ShowS
$cshowList :: [UVec3] -> ShowS
show :: UVec3 -> String
$cshow :: UVec3 -> String
showsPrec :: Int -> UVec3 -> ShowS
$cshowsPrec :: Int -> 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 :: 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) -> (Void# -> r) -> r
WithUVec3 a b c <- ((`withUVec3` (,,)) -> (a, b, c))
{-# COMPLETE WithUVec3 #-}

{-# 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

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 a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr UVec3
ptr  Int
0 Word32
a
      Ptr UVec3 -> 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 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 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 (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr UVec3 -> 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 (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr UVec3 -> 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
/= :: Packed -> Packed -> Bool
$c/= :: Packed -> Packed -> Bool
== :: Packed -> Packed -> Bool
$c== :: 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
min :: Packed -> Packed -> Packed
$cmin :: Packed -> Packed -> Packed
max :: Packed -> Packed -> Packed
$cmax :: Packed -> Packed -> Packed
>= :: Packed -> Packed -> Bool
$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
compare :: Packed -> Packed -> Ordering
$ccompare :: Packed -> Packed -> Ordering
$cp1Ord :: Eq 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
showList :: [Packed] -> ShowS
$cshowList :: [Packed] -> ShowS
show :: Packed -> String
$cshow :: Packed -> String
showsPrec :: Int -> Packed -> ShowS
$cshowsPrec :: Int -> Packed -> ShowS
Show, Packed -> ()
(Packed -> ()) -> NFData Packed
forall a. (a -> ()) -> NFData a
rnf :: Packed -> ()
$crnf :: 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
fromInteger :: Integer -> Packed
$cfromInteger :: Integer -> Packed
signum :: Packed -> Packed
$csignum :: Packed -> Packed
abs :: Packed -> Packed
$cabs :: Packed -> Packed
negate :: Packed -> Packed
$cnegate :: Packed -> Packed
* :: Packed -> Packed -> Packed
$c* :: Packed -> Packed -> Packed
- :: Packed -> Packed -> Packed
$c- :: Packed -> Packed -> Packed
+ :: Packed -> Packed -> Packed
$c+ :: Packed -> Packed -> 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 a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Packed
ptr Int
0 Word32
a
      Ptr Packed -> 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 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 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 (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Packed -> 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 (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr Packed -> Int -> IO Word32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Packed
ptr Int
8