{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}
module Geomancy.IVec3
( IVec3
, ivec3
, withIVec3
, pattern WithIVec3
, convert
, fromTuple
, dot
, Packed(..)
, packed
) where
import Control.DeepSeq (NFData(rnf))
import Data.Coerce (Coercible, coerce)
import Data.Int (Int32)
import Data.MonoTraversable (Element, MonoFunctor(..), MonoPointed(..))
import Foreign (Storable(..))
import Foreign.Ptr.Diff (peekDiffOff, pokeDiffOff)
import GHC.Ix (Ix(..))
import Geomancy.Elementwise (Elementwise(..))
import Graphics.Gl.Block (Block(..))
data IVec3 = IVec3
{-# UNPACK #-} !Int32
{-# UNPACK #-} !Int32
{-# UNPACK #-} !Int32
deriving (IVec3 -> IVec3 -> Bool
(IVec3 -> IVec3 -> Bool) -> (IVec3 -> IVec3 -> Bool) -> Eq IVec3
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IVec3 -> IVec3 -> Bool
== :: IVec3 -> IVec3 -> Bool
$c/= :: IVec3 -> IVec3 -> Bool
/= :: IVec3 -> IVec3 -> Bool
Eq, Eq IVec3
Eq IVec3 =>
(IVec3 -> IVec3 -> Ordering)
-> (IVec3 -> IVec3 -> Bool)
-> (IVec3 -> IVec3 -> Bool)
-> (IVec3 -> IVec3 -> Bool)
-> (IVec3 -> IVec3 -> Bool)
-> (IVec3 -> IVec3 -> IVec3)
-> (IVec3 -> IVec3 -> IVec3)
-> Ord IVec3
IVec3 -> IVec3 -> Bool
IVec3 -> IVec3 -> Ordering
IVec3 -> IVec3 -> IVec3
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 :: IVec3 -> IVec3 -> Ordering
compare :: IVec3 -> IVec3 -> Ordering
$c< :: IVec3 -> IVec3 -> Bool
< :: IVec3 -> IVec3 -> Bool
$c<= :: IVec3 -> IVec3 -> Bool
<= :: IVec3 -> IVec3 -> Bool
$c> :: IVec3 -> IVec3 -> Bool
> :: IVec3 -> IVec3 -> Bool
$c>= :: IVec3 -> IVec3 -> Bool
>= :: IVec3 -> IVec3 -> Bool
$cmax :: IVec3 -> IVec3 -> IVec3
max :: IVec3 -> IVec3 -> IVec3
$cmin :: IVec3 -> IVec3 -> IVec3
min :: IVec3 -> IVec3 -> IVec3
Ord, Int -> IVec3 -> ShowS
[IVec3] -> ShowS
IVec3 -> String
(Int -> IVec3 -> ShowS)
-> (IVec3 -> String) -> ([IVec3] -> ShowS) -> Show IVec3
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IVec3 -> ShowS
showsPrec :: Int -> IVec3 -> ShowS
$cshow :: IVec3 -> String
show :: IVec3 -> String
$cshowList :: [IVec3] -> ShowS
showList :: [IVec3] -> ShowS
Show)
{-# INLINE ivec3 #-}
ivec3 :: Int32 -> Int32 -> Int32 -> IVec3
ivec3 :: Int32 -> Int32 -> Int32 -> IVec3
ivec3 = Int32 -> Int32 -> Int32 -> IVec3
IVec3
{-# INLINE withIVec3 #-}
withIVec3
:: IVec3
-> (Int32 -> Int32 -> Int32 -> r)
-> r
withIVec3 :: forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 (IVec3 Int32
a Int32
b Int32
c) Int32 -> Int32 -> Int32 -> r
f = Int32 -> Int32 -> Int32 -> r
f Int32
a Int32
b Int32
c
pattern WithIVec3 :: Int32 -> Int32 -> Int32 -> IVec3
pattern $mWithIVec3 :: forall {r}.
IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> ((# #) -> r) -> r
WithIVec3 a b c <- ((`withIVec3` (,,)) -> (a, b, c))
{-# COMPLETE WithIVec3 #-}
{-# INLINE convert #-}
convert :: Coercible v IVec3 => (Int32 -> a) -> (a -> a -> a -> r) -> v -> r
convert :: forall v a r.
Coercible v IVec3 =>
(Int32 -> a) -> (a -> a -> a -> r) -> v -> r
convert Int32 -> a
f a -> a -> a -> r
t v
v =
IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 (v -> IVec3
forall a b. Coercible a b => a -> b
coerce v
v) \Int32
a Int32
b Int32
c ->
a -> a -> a -> r
t (Int32 -> a
f Int32
a) (Int32 -> a
f Int32
b) (Int32 -> a
f Int32
c)
{-# INLINE fromTuple #-}
fromTuple :: (Int32, Int32, Int32) -> IVec3
fromTuple :: (Int32, Int32, Int32) -> IVec3
fromTuple (Int32
a, Int32
b, Int32
c) = Int32 -> Int32 -> Int32 -> IVec3
ivec3 Int32
a Int32
b Int32
c
{-# INLINE dot #-}
dot :: IVec3 -> IVec3 -> Int32
dot :: IVec3 -> IVec3 -> Int32
dot (IVec3 Int32
l1 Int32
l2 Int32
l3) (IVec3 Int32
r1 Int32
r2 Int32
r3) =
Int32
l1 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
* Int32
r1 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
l2 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
* Int32
r2 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
l3 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
* Int32
r3
instance NFData IVec3 where
rnf :: IVec3 -> ()
rnf IVec3{} = ()
type instance Element IVec3 = Int32
instance MonoFunctor IVec3 where
{-# INLINE omap #-}
omap :: (Element IVec3 -> Element IVec3) -> IVec3 -> IVec3
omap Element IVec3 -> Element IVec3
f IVec3
v =
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
v \Int32
x Int32
y Int32
z ->
Int32 -> Int32 -> Int32 -> IVec3
ivec3 (Element IVec3 -> Element IVec3
f Int32
Element IVec3
x) (Element IVec3 -> Element IVec3
f Int32
Element IVec3
y) (Element IVec3 -> Element IVec3
f Int32
Element IVec3
z)
instance MonoPointed IVec3 where
opoint :: Element IVec3 -> IVec3
opoint Element IVec3
x = Int32 -> Int32 -> Int32 -> IVec3
ivec3 Int32
Element IVec3
x Int32
Element IVec3
x Int32
Element IVec3
x
instance Elementwise IVec3 where
{-# INLINE emap2 #-}
emap2 :: (Element IVec3 -> Element IVec3 -> Element IVec3)
-> IVec3 -> IVec3 -> IVec3
emap2 Element IVec3 -> Element IVec3 -> Element IVec3
f IVec3
p0 IVec3
p1 =
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p0 \Int32
x0 Int32
y0 Int32
z0 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p1 \Int32
x1 Int32
y1 Int32
z1 ->
Int32 -> Int32 -> Int32 -> IVec3
ivec3
(Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
x0 Int32
Element IVec3
x1)
(Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
y0 Int32
Element IVec3
y1)
(Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
z0 Int32
Element IVec3
z1)
{-# INLINE emap3 #-}
emap3 :: (Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3)
-> IVec3 -> IVec3 -> IVec3 -> IVec3
emap3 Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f IVec3
p0 IVec3
p1 IVec3
p2 =
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p0 \Int32
x0 Int32
y0 Int32
z0 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p1 \Int32
x1 Int32
y1 Int32
z1 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p2 \Int32
x2 Int32
y2 Int32
z2 ->
Int32 -> Int32 -> Int32 -> IVec3
ivec3
(Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
x0 Int32
Element IVec3
x1 Int32
Element IVec3
x2)
(Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
y0 Int32
Element IVec3
y1 Int32
Element IVec3
y2)
(Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
z0 Int32
Element IVec3
z1 Int32
Element IVec3
z2)
{-# INLINE emap4 #-}
emap4 :: (Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3)
-> IVec3 -> IVec3 -> IVec3 -> IVec3 -> IVec3
emap4 Element IVec3
-> Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f IVec3
p0 IVec3
p1 IVec3
p2 IVec3
p3 =
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p0 \Int32
x0 Int32
y0 Int32
z0 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p1 \Int32
x1 Int32
y1 Int32
z1 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p2 \Int32
x2 Int32
y2 Int32
z2 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p3 \Int32
x3 Int32
y3 Int32
z3 ->
Int32 -> Int32 -> Int32 -> IVec3
ivec3
(Element IVec3
-> Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
x0 Int32
Element IVec3
x1 Int32
Element IVec3
x2 Int32
Element IVec3
x3)
(Element IVec3
-> Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
y0 Int32
Element IVec3
y1 Int32
Element IVec3
y2 Int32
Element IVec3
y3)
(Element IVec3
-> Element IVec3 -> Element IVec3 -> Element IVec3 -> Element IVec3
f Int32
Element IVec3
z0 Int32
Element IVec3
z1 Int32
Element IVec3
z2 Int32
Element IVec3
z3)
{-# INLINE emap5 #-}
emap5 :: (Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3)
-> IVec3 -> IVec3 -> IVec3 -> IVec3 -> IVec3 -> IVec3
emap5 Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
f IVec3
p0 IVec3
p1 IVec3
p2 IVec3
p3 IVec3
p4 =
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p0 \Int32
x0 Int32
y0 Int32
z0 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p1 \Int32
x1 Int32
y1 Int32
z1 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p2 \Int32
x2 Int32
y2 Int32
z2 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p3 \Int32
x3 Int32
y3 Int32
z3 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
p4 \Int32
x4 Int32
y4 Int32
z4 ->
Int32 -> Int32 -> Int32 -> IVec3
ivec3
(Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
f Int32
Element IVec3
x0 Int32
Element IVec3
x1 Int32
Element IVec3
x2 Int32
Element IVec3
x3 Int32
Element IVec3
x4)
(Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
f Int32
Element IVec3
y0 Int32
Element IVec3
y1 Int32
Element IVec3
y2 Int32
Element IVec3
y3 Int32
Element IVec3
y4)
(Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
-> Element IVec3
f Int32
Element IVec3
z0 Int32
Element IVec3
z1 Int32
Element IVec3
z2 Int32
Element IVec3
z3 Int32
Element IVec3
z4)
instance Num IVec3 where
{-# INLINE (+) #-}
IVec3 Int32
l1 Int32
l2 Int32
l3 + :: IVec3 -> IVec3 -> IVec3
+ IVec3 Int32
r1 Int32
r2 Int32
r3 =
Int32 -> Int32 -> Int32 -> IVec3
IVec3
(Int32
l1 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
r1)
(Int32
l2 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
r2)
(Int32
l3 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
r3)
{-# INLINE (-) #-}
IVec3 Int32
l1 Int32
l2 Int32
l3 - :: IVec3 -> IVec3 -> IVec3
- IVec3 Int32
r1 Int32
r2 Int32
r3 =
Int32 -> Int32 -> Int32 -> IVec3
IVec3
(Int32
l1 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
r1)
(Int32
l2 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
r2)
(Int32
l3 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
r3)
{-# INLINE (*) #-}
IVec3 Int32
l1 Int32
l2 Int32
l3 * :: IVec3 -> IVec3 -> IVec3
* IVec3 Int32
r1 Int32
r2 Int32
r3 =
Int32 -> Int32 -> Int32 -> IVec3
IVec3
(Int32
l1 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
* Int32
r1)
(Int32
l2 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
* Int32
r2)
(Int32
l3 Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
* Int32
r3)
{-# INLINE abs #-}
abs :: IVec3 -> IVec3
abs IVec3
x = IVec3
x
{-# INLINE signum #-}
signum :: IVec3 -> IVec3
signum IVec3
v3 = IVec3 -> (Int32 -> Int32 -> Int32 -> IVec3) -> IVec3
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
v3 \Int32
a Int32
b Int32
c ->
Int32 -> Int32 -> Int32 -> IVec3
ivec3 (Int32 -> Int32
forall a. Num a => a -> a
signum Int32
a) (Int32 -> Int32
forall a. Num a => a -> a
signum Int32
b) (Int32 -> Int32
forall a. Num a => a -> a
signum Int32
c)
{-# INLINE fromInteger #-}
fromInteger :: Integer -> IVec3
fromInteger Integer
x = Int32 -> Int32 -> Int32 -> IVec3
IVec3 Int32
x' Int32
x' Int32
x'
where
x' :: Int32
x' = Integer -> Int32
forall a. Num a => Integer -> a
fromInteger Integer
x
instance Storable IVec3 where
{-# INLINE sizeOf #-}
sizeOf :: IVec3 -> Int
sizeOf IVec3
_ = Int
16
{-# INLINE alignment #-}
alignment :: IVec3 -> Int
alignment IVec3
_ = Int
8
{-# INLINE poke #-}
poke :: Ptr IVec3 -> IVec3 -> IO ()
poke Ptr IVec3
ptr IVec3
v3 =
IVec3 -> (Int32 -> Int32 -> Int32 -> IO ()) -> IO ()
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
v3 \Int32
a Int32
b Int32
c -> do
Ptr IVec3 -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr IVec3
ptr Int
0 Int32
a
Ptr IVec3 -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr IVec3
ptr Int
4 Int32
b
Ptr IVec3 -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr IVec3
ptr Int
8 Int32
c
{-# INLINE peek #-}
peek :: Ptr IVec3 -> IO IVec3
peek Ptr IVec3
ptr = Int32 -> Int32 -> Int32 -> IVec3
ivec3
(Int32 -> Int32 -> Int32 -> IVec3)
-> IO Int32 -> IO (Int32 -> Int32 -> IVec3)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr IVec3 -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr IVec3
ptr Int
0
IO (Int32 -> Int32 -> IVec3) -> IO Int32 -> IO (Int32 -> IVec3)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr IVec3 -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr IVec3
ptr Int
4
IO (Int32 -> IVec3) -> IO Int32 -> IO IVec3
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr IVec3 -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr IVec3
ptr Int
8
newtype Packed = Packed { Packed -> IVec3
unPacked :: IVec3 }
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 :: Int32 -> Int32 -> Int32 -> Packed
packed :: Int32 -> Int32 -> Int32 -> Packed
packed Int32
a Int32
b Int32
c = IVec3 -> Packed
Packed (Int32 -> Int32 -> Int32 -> IVec3
ivec3 Int32
a Int32
b Int32
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 IVec3
v3) =
IVec3 -> (Int32 -> Int32 -> Int32 -> IO ()) -> IO ()
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
v3 \Int32
a Int32
b Int32
c -> do
Ptr Packed -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Packed
ptr Int
0 Int32
a
Ptr Packed -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Packed
ptr Int
4 Int32
b
Ptr Packed -> Int -> Int32 -> IO ()
forall b. Ptr b -> Int -> Int32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr Packed
ptr Int
8 Int32
c
{-# INLINE peek #-}
peek :: Ptr Packed -> IO Packed
peek Ptr Packed
ptr = Int32 -> Int32 -> Int32 -> Packed
packed
(Int32 -> Int32 -> Int32 -> Packed)
-> IO Int32 -> IO (Int32 -> Int32 -> Packed)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Packed -> Int -> IO Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Packed
ptr Int
0
IO (Int32 -> Int32 -> Packed) -> IO Int32 -> IO (Int32 -> 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 Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Packed
ptr Int
4
IO (Int32 -> Packed) -> IO Int32 -> 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 Int32
forall b. Ptr b -> Int -> IO Int32
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Packed
ptr Int
8
instance Block IVec3 where
type PackedSize IVec3 = 12
alignment140 :: forall (proxy :: * -> *). proxy IVec3 -> Int
alignment140 proxy IVec3
_ = Int
16
sizeOf140 :: forall (proxy :: * -> *). proxy IVec3 -> Int
sizeOf140 proxy IVec3
_ = Int
16
alignment430 :: forall (proxy :: * -> *). proxy IVec3 -> Int
alignment430 = proxy IVec3 -> Int
forall b (proxy :: * -> *). Block b => proxy b -> Int
forall (proxy :: * -> *). proxy IVec3 -> Int
alignment140
sizeOf430 :: forall (proxy :: * -> *). proxy IVec3 -> Int
sizeOf430 = proxy IVec3 -> Int
forall b (proxy :: * -> *). Block b => proxy b -> Int
forall (proxy :: * -> *). proxy IVec3 -> Int
sizeOf140
isStruct :: forall (proxy :: * -> *). proxy IVec3 -> Bool
isStruct proxy IVec3
_ = Bool
False
read140 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a IVec3 -> m IVec3
read140 = Ptr a -> Diff a IVec3 -> m IVec3
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 IVec3 -> IVec3 -> m ()
write140 = Ptr a -> Diff a IVec3 -> IVec3 -> 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 IVec3 -> m IVec3
read430 = Ptr a -> Diff a IVec3 -> m IVec3
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> m b
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a IVec3 -> m IVec3
read140
write430 :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a IVec3 -> IVec3 -> m ()
write430 = Ptr a -> Diff a IVec3 -> IVec3 -> 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 IVec3 -> IVec3 -> m ()
write140
readPacked :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a IVec3 -> m IVec3
readPacked = Ptr a -> Diff a IVec3 -> m IVec3
forall b (m :: * -> *) a.
(Block b, MonadIO m) =>
Ptr a -> Diff a b -> m b
forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a IVec3 -> m IVec3
read140
writePacked :: forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> Diff a IVec3 -> IVec3 -> m ()
writePacked = Ptr a -> Diff a IVec3 -> IVec3 -> 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 IVec3 -> IVec3 -> 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 IVec3 where
{-# INLINE range #-}
range :: (IVec3, IVec3) -> [IVec3]
range (IVec3
l, IVec3
u) =
IVec3 -> (Int32 -> Int32 -> Int32 -> [IVec3]) -> [IVec3]
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
l \Int32
l1 Int32
l2 Int32
l3 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> [IVec3]) -> [IVec3]
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
u \Int32
u1 Int32
u2 Int32
u3 ->
Int32 -> Int32 -> Int32 -> IVec3
ivec3
(Int32 -> Int32 -> Int32 -> IVec3)
-> [Int32] -> [Int32 -> Int32 -> IVec3]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int32, Int32) -> [Int32]
forall a. Ix a => (a, a) -> [a]
range (Int32
l1, Int32
u1)
[Int32 -> Int32 -> IVec3] -> [Int32] -> [Int32 -> IVec3]
forall a b. [a -> b] -> [a] -> [b]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int32, Int32) -> [Int32]
forall a. Ix a => (a, a) -> [a]
range (Int32
l2, Int32
u2)
[Int32 -> IVec3] -> [Int32] -> [IVec3]
forall a b. [a -> b] -> [a] -> [b]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int32, Int32) -> [Int32]
forall a. Ix a => (a, a) -> [a]
range (Int32
l3, Int32
u3)
{-# INLINE unsafeIndex #-}
unsafeIndex :: (IVec3, IVec3) -> IVec3 -> Int
unsafeIndex (IVec3
l, IVec3
u) IVec3
i =
IVec3 -> (Int32 -> Int32 -> Int32 -> Int) -> Int
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
l \Int32
l1 Int32
l2 Int32
l3 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> Int) -> Int
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
u \Int32
u1 Int32
u2 Int32
u3 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> Int) -> Int
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
i \Int32
i1 Int32
i2 Int32
i3 ->
(Int32, Int32) -> Int32 -> Int
forall a. Ix a => (a, a) -> a -> Int
unsafeIndex (Int32
l3, Int32
u3) Int32
i3 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int32, Int32) -> Int
forall a. Ix a => (a, a) -> Int
unsafeRangeSize (Int32
l3, Int32
u3) Int -> Int -> Int
forall a. Num a => a -> a -> a
* (
(Int32, Int32) -> Int32 -> Int
forall a. Ix a => (a, a) -> a -> Int
unsafeIndex (Int32
l2, Int32
u2) Int32
i2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int32, Int32) -> Int
forall a. Ix a => (a, a) -> Int
unsafeRangeSize (Int32
l2, Int32
u2) Int -> Int -> Int
forall a. Num a => a -> a -> a
* (
(Int32, Int32) -> Int32 -> Int
forall a. Ix a => (a, a) -> a -> Int
unsafeIndex (Int32
l1, Int32
u1) Int32
i1))
{-# INLINE inRange #-}
inRange :: (IVec3, IVec3) -> IVec3 -> Bool
inRange (IVec3
l, IVec3
u) IVec3
i =
IVec3 -> (Int32 -> Int32 -> Int32 -> Bool) -> Bool
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
l \Int32
l1 Int32
l2 Int32
l3 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> Bool) -> Bool
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
u \Int32
u1 Int32
u2 Int32
u3 ->
IVec3 -> (Int32 -> Int32 -> Int32 -> Bool) -> Bool
forall r. IVec3 -> (Int32 -> Int32 -> Int32 -> r) -> r
withIVec3 IVec3
i \Int32
i1 Int32
i2 Int32
i3 ->
(Int32, Int32) -> Int32 -> Bool
forall a. Ix a => (a, a) -> a -> Bool
inRange (Int32
l1, Int32
u1) Int32
i1 Bool -> Bool -> Bool
&&
(Int32, Int32) -> Int32 -> Bool
forall a. Ix a => (a, a) -> a -> Bool
inRange (Int32
l2, Int32
u2) Int32
i2 Bool -> Bool -> Bool
&&
(Int32, Int32) -> Int32 -> Bool
forall a. Ix a => (a, a) -> a -> Bool
inRange (Int32
l3, Int32
u3) Int32
i3