module Aztecs.Entity where

import Data.Bits
import Data.Word

newtype Entity = Entity {Entity -> Word64
unEntity :: Word64}
  deriving (Entity -> Entity -> Bool
(Entity -> Entity -> Bool)
-> (Entity -> Entity -> Bool) -> Eq Entity
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Entity -> Entity -> Bool
== :: Entity -> Entity -> Bool
$c/= :: Entity -> Entity -> Bool
/= :: Entity -> Entity -> Bool
Eq, Eq Entity
Eq Entity =>
(Entity -> Entity -> Ordering)
-> (Entity -> Entity -> Bool)
-> (Entity -> Entity -> Bool)
-> (Entity -> Entity -> Bool)
-> (Entity -> Entity -> Bool)
-> (Entity -> Entity -> Entity)
-> (Entity -> Entity -> Entity)
-> Ord Entity
Entity -> Entity -> Bool
Entity -> Entity -> Ordering
Entity -> Entity -> Entity
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 :: Entity -> Entity -> Ordering
compare :: Entity -> Entity -> Ordering
$c< :: Entity -> Entity -> Bool
< :: Entity -> Entity -> Bool
$c<= :: Entity -> Entity -> Bool
<= :: Entity -> Entity -> Bool
$c> :: Entity -> Entity -> Bool
> :: Entity -> Entity -> Bool
$c>= :: Entity -> Entity -> Bool
>= :: Entity -> Entity -> Bool
$cmax :: Entity -> Entity -> Entity
max :: Entity -> Entity -> Entity
$cmin :: Entity -> Entity -> Entity
min :: Entity -> Entity -> Entity
Ord)

instance Show Entity where
  show :: Entity -> String
show Entity
e = String
"Entity {index = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word32 -> String
forall a. Show a => a -> String
show (Entity -> Word32
entityIndex Entity
e) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", generation = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word32 -> String
forall a. Show a => a -> String
show (Entity -> Word32
entityGeneration Entity
e) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"}"

mkEntity :: Word32 -> Word32 -> Entity
mkEntity :: Word32 -> Word32 -> Entity
mkEntity Word32
index Word32
generation = Word64 -> Entity
Entity (Word64 -> Entity) -> Word64 -> Entity
forall a b. (a -> b) -> a -> b
$ (Word32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
generation Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftL` Int
32) Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.|. Word32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
index
{-# INLINE mkEntity #-}

entityIndex :: Entity -> Word32
entityIndex :: Entity -> Word32
entityIndex (Entity Word64
e) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
e Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.&. Word64
0xFFFFFFFF)
{-# INLINE entityIndex #-}

entityGeneration :: Entity -> Word32
entityGeneration :: Entity -> Word32
entityGeneration (Entity Word64
e) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral ((Word64
e Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftR` Int
32) Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.&. Word64
0xFFFFFFFF)
{-# INLINE entityGeneration #-}