module Data.DimensionalHash
(
MortonNumber(..)
) where
import Data.Bits
class (Bits a) => (MortonNumber a) where
toMortonNumber3d :: a -> a -> a -> a
toMortonNumber3d x y z =
x4 .|. (shift y 1) .|. (shift z 2)
where
x1 = (x .|. (shift x 16)) .&. 0x030000FF
x2 = (x1 .|. (shift x1 8)) .&. 0x0300F00F
x3 = (x2 .|. (shift x2 4)) .&. 0x030C30C3
x4 = (x3 .|. (shift x3 2)) .&. 0x09249249
toMortonNumber2d :: a -> a -> a
toMortonNumber2d x y = x4 .|. (shift y4 1)
where
x1 = (x .|. (shift x 8)) .&. 0x00FF00FF
x2 = (x1 .|. (shift x1 4)) .&. 0x0F0F0F0F
x3 = (x2 .|. (shift x2 2)) .&. 0x33333333
x4 = (x3 .|. (shift x3 1)) .&. 0x55555555
y1 = (y .|. (shift y 8)) .&. 0x00FF00FF
y2 = (y1 .|. (shift y1 4)) .&. 0x0F0F0F0F
y3 = (y2 .|. (shift y2 2)) .&. 0x33333333
y4 = (y3 .|. (shift y3 1)) .&. 0x55555555
instance MortonNumber Integer