{-# LANGUAGE CPP #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeApplications #-}
module Data.Chimera.ContinuousMapping (
intToWord,
wordToInt,
HalfWord,
toZCurve,
fromZCurve,
throughZCurveFix,
ThirdWord,
toZCurve3,
fromZCurve3,
throughZCurveFix3,
) where
import Data.Bifunctor
import Data.Bits
import Data.Chimera.FromIntegral
import Data.Coerce
import Data.Word
#include "MachDeps.h"
intToWord :: Int -> Word
intToWord :: Int -> Word
intToWord Int
i = (if Word
sign forall a. Eq a => a -> a -> Bool
== Word
0 then forall a. a -> a
id else forall a. Bits a => a -> a
complement) (Int -> Word
int2word Int
i) forall a. Bits a => a -> Int -> a
`shiftL` Int
1 forall a. Num a => a -> a -> a
+ Word
sign
where
sign :: Word
sign = Int -> Word
int2word Int
i forall a. Bits a => a -> Int -> a
`shiftR` (forall b. FiniteBits b => b -> Int
finiteBitSize Int
i forall a. Num a => a -> a -> a
- Int
1)
{-# INLINE intToWord #-}
wordToInt :: Word -> Int
wordToInt :: Word -> Int
wordToInt Word
w = Word -> Int
word2int forall a b. (a -> b) -> a -> b
$ (if Word
w forall a. Bits a => a -> a -> a
.&. Word
1 forall a. Eq a => a -> a -> Bool
== Word
0 then forall a. a -> a
id else forall a. Bits a => a -> a
complement) (Word
w forall a. Bits a => a -> Int -> a
`shiftR` Int
1)
{-# INLINE wordToInt #-}
#if WORD_SIZE_IN_BITS == 64
newtype HalfWord = HalfWord Word32
deriving newtype (HalfWord -> HalfWord -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HalfWord -> HalfWord -> Bool
$c/= :: HalfWord -> HalfWord -> Bool
== :: HalfWord -> HalfWord -> Bool
$c== :: HalfWord -> HalfWord -> Bool
Eq, Eq HalfWord
HalfWord -> HalfWord -> Bool
HalfWord -> HalfWord -> Ordering
HalfWord -> HalfWord -> HalfWord
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 :: HalfWord -> HalfWord -> HalfWord
$cmin :: HalfWord -> HalfWord -> HalfWord
max :: HalfWord -> HalfWord -> HalfWord
$cmax :: HalfWord -> HalfWord -> HalfWord
>= :: HalfWord -> HalfWord -> Bool
$c>= :: HalfWord -> HalfWord -> Bool
> :: HalfWord -> HalfWord -> Bool
$c> :: HalfWord -> HalfWord -> Bool
<= :: HalfWord -> HalfWord -> Bool
$c<= :: HalfWord -> HalfWord -> Bool
< :: HalfWord -> HalfWord -> Bool
$c< :: HalfWord -> HalfWord -> Bool
compare :: HalfWord -> HalfWord -> Ordering
$ccompare :: HalfWord -> HalfWord -> Ordering
Ord, Int -> HalfWord -> ShowS
[HalfWord] -> ShowS
HalfWord -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HalfWord] -> ShowS
$cshowList :: [HalfWord] -> ShowS
show :: HalfWord -> String
$cshow :: HalfWord -> String
showsPrec :: Int -> HalfWord -> ShowS
$cshowsPrec :: Int -> HalfWord -> ShowS
Show, ReadPrec [HalfWord]
ReadPrec HalfWord
Int -> ReadS HalfWord
ReadS [HalfWord]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [HalfWord]
$creadListPrec :: ReadPrec [HalfWord]
readPrec :: ReadPrec HalfWord
$creadPrec :: ReadPrec HalfWord
readList :: ReadS [HalfWord]
$creadList :: ReadS [HalfWord]
readsPrec :: Int -> ReadS HalfWord
$creadsPrec :: Int -> ReadS HalfWord
Read, Eq HalfWord
HalfWord
Int -> HalfWord
HalfWord -> Bool
HalfWord -> Int
HalfWord -> Maybe Int
HalfWord -> HalfWord
HalfWord -> Int -> Bool
HalfWord -> Int -> HalfWord
HalfWord -> HalfWord -> HalfWord
forall a.
Eq a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> a
-> (Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> Bool)
-> (a -> Maybe Int)
-> (a -> Int)
-> (a -> Bool)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int)
-> Bits a
popCount :: HalfWord -> Int
$cpopCount :: HalfWord -> Int
rotateR :: HalfWord -> Int -> HalfWord
$crotateR :: HalfWord -> Int -> HalfWord
rotateL :: HalfWord -> Int -> HalfWord
$crotateL :: HalfWord -> Int -> HalfWord
unsafeShiftR :: HalfWord -> Int -> HalfWord
$cunsafeShiftR :: HalfWord -> Int -> HalfWord
shiftR :: HalfWord -> Int -> HalfWord
$cshiftR :: HalfWord -> Int -> HalfWord
unsafeShiftL :: HalfWord -> Int -> HalfWord
$cunsafeShiftL :: HalfWord -> Int -> HalfWord
shiftL :: HalfWord -> Int -> HalfWord
$cshiftL :: HalfWord -> Int -> HalfWord
isSigned :: HalfWord -> Bool
$cisSigned :: HalfWord -> Bool
bitSize :: HalfWord -> Int
$cbitSize :: HalfWord -> Int
bitSizeMaybe :: HalfWord -> Maybe Int
$cbitSizeMaybe :: HalfWord -> Maybe Int
testBit :: HalfWord -> Int -> Bool
$ctestBit :: HalfWord -> Int -> Bool
complementBit :: HalfWord -> Int -> HalfWord
$ccomplementBit :: HalfWord -> Int -> HalfWord
clearBit :: HalfWord -> Int -> HalfWord
$cclearBit :: HalfWord -> Int -> HalfWord
setBit :: HalfWord -> Int -> HalfWord
$csetBit :: HalfWord -> Int -> HalfWord
bit :: Int -> HalfWord
$cbit :: Int -> HalfWord
zeroBits :: HalfWord
$czeroBits :: HalfWord
rotate :: HalfWord -> Int -> HalfWord
$crotate :: HalfWord -> Int -> HalfWord
shift :: HalfWord -> Int -> HalfWord
$cshift :: HalfWord -> Int -> HalfWord
complement :: HalfWord -> HalfWord
$ccomplement :: HalfWord -> HalfWord
xor :: HalfWord -> HalfWord -> HalfWord
$cxor :: HalfWord -> HalfWord -> HalfWord
.|. :: HalfWord -> HalfWord -> HalfWord
$c.|. :: HalfWord -> HalfWord -> HalfWord
.&. :: HalfWord -> HalfWord -> HalfWord
$c.&. :: HalfWord -> HalfWord -> HalfWord
Bits, Bits HalfWord
HalfWord -> Int
forall b.
Bits b -> (b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b
countTrailingZeros :: HalfWord -> Int
$ccountTrailingZeros :: HalfWord -> Int
countLeadingZeros :: HalfWord -> Int
$ccountLeadingZeros :: HalfWord -> Int
finiteBitSize :: HalfWord -> Int
$cfiniteBitSize :: HalfWord -> Int
FiniteBits, HalfWord
forall a. a -> a -> Bounded a
maxBound :: HalfWord
$cmaxBound :: HalfWord
minBound :: HalfWord
$cminBound :: HalfWord
Bounded, Int -> HalfWord
HalfWord -> Int
HalfWord -> [HalfWord]
HalfWord -> HalfWord
HalfWord -> HalfWord -> [HalfWord]
HalfWord -> HalfWord -> HalfWord -> [HalfWord]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: HalfWord -> HalfWord -> HalfWord -> [HalfWord]
$cenumFromThenTo :: HalfWord -> HalfWord -> HalfWord -> [HalfWord]
enumFromTo :: HalfWord -> HalfWord -> [HalfWord]
$cenumFromTo :: HalfWord -> HalfWord -> [HalfWord]
enumFromThen :: HalfWord -> HalfWord -> [HalfWord]
$cenumFromThen :: HalfWord -> HalfWord -> [HalfWord]
enumFrom :: HalfWord -> [HalfWord]
$cenumFrom :: HalfWord -> [HalfWord]
fromEnum :: HalfWord -> Int
$cfromEnum :: HalfWord -> Int
toEnum :: Int -> HalfWord
$ctoEnum :: Int -> HalfWord
pred :: HalfWord -> HalfWord
$cpred :: HalfWord -> HalfWord
succ :: HalfWord -> HalfWord
$csucc :: HalfWord -> HalfWord
Enum, Integer -> HalfWord
HalfWord -> HalfWord
HalfWord -> HalfWord -> HalfWord
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> HalfWord
$cfromInteger :: Integer -> HalfWord
signum :: HalfWord -> HalfWord
$csignum :: HalfWord -> HalfWord
abs :: HalfWord -> HalfWord
$cabs :: HalfWord -> HalfWord
negate :: HalfWord -> HalfWord
$cnegate :: HalfWord -> HalfWord
* :: HalfWord -> HalfWord -> HalfWord
$c* :: HalfWord -> HalfWord -> HalfWord
- :: HalfWord -> HalfWord -> HalfWord
$c- :: HalfWord -> HalfWord -> HalfWord
+ :: HalfWord -> HalfWord -> HalfWord
$c+ :: HalfWord -> HalfWord -> HalfWord
Num, Enum HalfWord
Real HalfWord
HalfWord -> Integer
HalfWord -> HalfWord -> (HalfWord, HalfWord)
HalfWord -> HalfWord -> HalfWord
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: HalfWord -> Integer
$ctoInteger :: HalfWord -> Integer
divMod :: HalfWord -> HalfWord -> (HalfWord, HalfWord)
$cdivMod :: HalfWord -> HalfWord -> (HalfWord, HalfWord)
quotRem :: HalfWord -> HalfWord -> (HalfWord, HalfWord)
$cquotRem :: HalfWord -> HalfWord -> (HalfWord, HalfWord)
mod :: HalfWord -> HalfWord -> HalfWord
$cmod :: HalfWord -> HalfWord -> HalfWord
div :: HalfWord -> HalfWord -> HalfWord
$cdiv :: HalfWord -> HalfWord -> HalfWord
rem :: HalfWord -> HalfWord -> HalfWord
$crem :: HalfWord -> HalfWord -> HalfWord
quot :: HalfWord -> HalfWord -> HalfWord
$cquot :: HalfWord -> HalfWord -> HalfWord
Integral, Num HalfWord
Ord HalfWord
HalfWord -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: HalfWord -> Rational
$ctoRational :: HalfWord -> Rational
Real)
#else
newtype HalfWord = HalfWord Word16
deriving newtype (Eq, Ord, Show, Read, Bits, FiniteBits, Bounded, Enum, Num, Integral, Real)
#endif
toZCurve :: HalfWord -> HalfWord -> Word
toZCurve :: HalfWord -> HalfWord -> Word
toZCurve HalfWord
x HalfWord
y = HalfWord -> Word
part1by1 HalfWord
y forall a. Bits a => a -> Int -> a
`shiftL` Int
1 forall a. Bits a => a -> a -> a
.|. HalfWord -> Word
part1by1 HalfWord
x
fromZCurve :: Word -> (HalfWord, HalfWord)
fromZCurve :: Word -> (HalfWord, HalfWord)
fromZCurve Word
z = (Word -> HalfWord
compact1by1 Word
z, Word -> HalfWord
compact1by1 (Word
z forall a. Bits a => a -> Int -> a
`shiftR` Int
1))
contramapFromZCurve
:: (HalfWord -> HalfWord -> a)
-> (Word -> a)
contramapFromZCurve :: forall a. (HalfWord -> HalfWord -> a) -> Word -> a
contramapFromZCurve HalfWord -> HalfWord -> a
f = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry HalfWord -> HalfWord -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> (HalfWord, HalfWord)
fromZCurve
contramapToZCurve
:: (Word -> a)
-> (HalfWord -> HalfWord -> a)
contramapToZCurve :: forall a. (Word -> a) -> HalfWord -> HalfWord -> a
contramapToZCurve Word -> a
f = (Word -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. HalfWord -> HalfWord -> Word
toZCurve
throughZCurveFix
:: ((HalfWord -> HalfWord -> a) -> (HalfWord -> HalfWord -> a))
-> (Word -> a)
-> (Word -> a)
throughZCurveFix :: forall a.
((HalfWord -> HalfWord -> a) -> HalfWord -> HalfWord -> a)
-> (Word -> a) -> Word -> a
throughZCurveFix (HalfWord -> HalfWord -> a) -> HalfWord -> HalfWord -> a
f = forall a. (HalfWord -> HalfWord -> a) -> Word -> a
contramapFromZCurve forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HalfWord -> HalfWord -> a) -> HalfWord -> HalfWord -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Word -> a) -> HalfWord -> HalfWord -> a
contramapToZCurve
newtype ThirdWord = ThirdWord Word32
deriving newtype (ThirdWord -> ThirdWord -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThirdWord -> ThirdWord -> Bool
$c/= :: ThirdWord -> ThirdWord -> Bool
== :: ThirdWord -> ThirdWord -> Bool
$c== :: ThirdWord -> ThirdWord -> Bool
Eq, Eq ThirdWord
ThirdWord -> ThirdWord -> Bool
ThirdWord -> ThirdWord -> Ordering
ThirdWord -> ThirdWord -> ThirdWord
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 :: ThirdWord -> ThirdWord -> ThirdWord
$cmin :: ThirdWord -> ThirdWord -> ThirdWord
max :: ThirdWord -> ThirdWord -> ThirdWord
$cmax :: ThirdWord -> ThirdWord -> ThirdWord
>= :: ThirdWord -> ThirdWord -> Bool
$c>= :: ThirdWord -> ThirdWord -> Bool
> :: ThirdWord -> ThirdWord -> Bool
$c> :: ThirdWord -> ThirdWord -> Bool
<= :: ThirdWord -> ThirdWord -> Bool
$c<= :: ThirdWord -> ThirdWord -> Bool
< :: ThirdWord -> ThirdWord -> Bool
$c< :: ThirdWord -> ThirdWord -> Bool
compare :: ThirdWord -> ThirdWord -> Ordering
$ccompare :: ThirdWord -> ThirdWord -> Ordering
Ord, Int -> ThirdWord -> ShowS
[ThirdWord] -> ShowS
ThirdWord -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ThirdWord] -> ShowS
$cshowList :: [ThirdWord] -> ShowS
show :: ThirdWord -> String
$cshow :: ThirdWord -> String
showsPrec :: Int -> ThirdWord -> ShowS
$cshowsPrec :: Int -> ThirdWord -> ShowS
Show)
mkThirdWord :: Word32 -> ThirdWord
mkThirdWord :: Word32 -> ThirdWord
mkThirdWord Word32
n = ThirdWord
t
where
t :: ThirdWord
t = Word32 -> ThirdWord
ThirdWord (Word32
n forall a. Bits a => a -> a -> a
.&. ((Word32
1 forall a. Bits a => a -> Int -> a
`shiftL` forall b. FiniteBits b => b -> Int
finiteBitSize ThirdWord
t) forall a. Num a => a -> a -> a
- Word32
1))
instance Read ThirdWord where
readsPrec :: Int -> ReadS ThirdWord
readsPrec = (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first Word32 -> ThirdWord
mkThirdWord) forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Read a => Int -> ReadS a
readsPrec
instance Bits ThirdWord where
.&. :: ThirdWord -> ThirdWord -> ThirdWord
(.&.) = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Bits a => a -> a -> a
(.&.) @Word32)
.|. :: ThirdWord -> ThirdWord -> ThirdWord
(.|.) = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Bits a => a -> a -> a
(.|.) @Word32)
xor :: ThirdWord -> ThirdWord -> ThirdWord
xor = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Bits a => a -> a -> a
xor @Word32)
complement :: ThirdWord -> ThirdWord
complement (ThirdWord Word32
n) = Word32 -> ThirdWord
mkThirdWord (forall a. Bits a => a -> a
complement Word32
n)
shift :: ThirdWord -> Int -> ThirdWord
shift (ThirdWord Word32
n) Int
k = Word32 -> ThirdWord
mkThirdWord (forall a. Bits a => a -> Int -> a
shift Word32
n Int
k)
bitSize :: ThirdWord -> Int
bitSize = forall b. FiniteBits b => b -> Int
finiteBitSize
bitSizeMaybe :: ThirdWord -> Maybe Int
bitSizeMaybe = forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b. FiniteBits b => b -> Int
finiteBitSize
isSigned :: ThirdWord -> Bool
isSigned = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Bits a => a -> Bool
isSigned @Word32)
testBit :: ThirdWord -> Int -> Bool
testBit = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Bits a => a -> Int -> Bool
testBit @Word32)
bit :: Int -> ThirdWord
bit = Word32 -> ThirdWord
mkThirdWord forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Bits a => Int -> a
bit
popCount :: ThirdWord -> Int
popCount = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Bits a => a -> Int
popCount @Word32)
rotate :: ThirdWord -> Int -> ThirdWord
rotate ThirdWord
t Int
k'
| Int
k forall a. Eq a => a -> a -> Bool
== Int
0 = ThirdWord
t
| Bool
otherwise = (ThirdWord
t forall a. Bits a => a -> Int -> a
`shiftL` Int
k) forall a. Bits a => a -> a -> a
.|. (ThirdWord
t forall a. Bits a => a -> Int -> a
`shiftR` (Int
fbs forall a. Num a => a -> a -> a
- Int
k))
where
fbs :: Int
fbs = forall b. FiniteBits b => b -> Int
finiteBitSize ThirdWord
t
k :: Int
k = Int
k' forall a. Integral a => a -> a -> a
`mod` Int
fbs
instance FiniteBits ThirdWord where
finiteBitSize :: ThirdWord -> Int
finiteBitSize = forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall b. FiniteBits b => b -> Int
finiteBitSize (Word
0 :: Word) forall a. Integral a => a -> a -> a
`quot` Int
3
instance Bounded ThirdWord where
minBound :: ThirdWord
minBound = Word32 -> ThirdWord
mkThirdWord forall a. Bounded a => a
minBound
maxBound :: ThirdWord
maxBound = Word32 -> ThirdWord
mkThirdWord forall a. Bounded a => a
maxBound
instance Enum ThirdWord where
toEnum :: Int -> ThirdWord
toEnum = Word32 -> ThirdWord
mkThirdWord forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Enum a => Int -> a
toEnum
fromEnum :: ThirdWord -> Int
fromEnum = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Enum a => a -> Int
fromEnum @Word32)
instance Num ThirdWord where
ThirdWord Word32
x + :: ThirdWord -> ThirdWord -> ThirdWord
+ ThirdWord Word32
y = Word32 -> ThirdWord
mkThirdWord (Word32
x forall a. Num a => a -> a -> a
+ Word32
y)
ThirdWord Word32
x * :: ThirdWord -> ThirdWord -> ThirdWord
* ThirdWord Word32
y = Word32 -> ThirdWord
mkThirdWord (Word32
x forall a. Num a => a -> a -> a
* Word32
y)
negate :: ThirdWord -> ThirdWord
negate (ThirdWord Word32
x) = Word32 -> ThirdWord
mkThirdWord (forall a. Num a => a -> a
negate Word32
x)
abs :: ThirdWord -> ThirdWord
abs = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Num a => a -> a
abs @Word32)
signum :: ThirdWord -> ThirdWord
signum = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Num a => a -> a
signum @Word32)
fromInteger :: Integer -> ThirdWord
fromInteger = Word32 -> ThirdWord
mkThirdWord forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => Integer -> a
fromInteger
instance Real ThirdWord where
toRational :: ThirdWord -> Rational
toRational = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Real a => a -> Rational
toRational @Word32)
instance Integral ThirdWord where
quotRem :: ThirdWord -> ThirdWord -> (ThirdWord, ThirdWord)
quotRem = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Integral a => a -> a -> (a, a)
quotRem @Word32)
toInteger :: ThirdWord -> Integer
toInteger = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Integral a => a -> Integer
toInteger @Word32)
toZCurve3 :: ThirdWord -> ThirdWord -> ThirdWord -> Word
toZCurve3 :: ThirdWord -> ThirdWord -> ThirdWord -> Word
toZCurve3 ThirdWord
x ThirdWord
y ThirdWord
z = ThirdWord -> Word
part1by2 ThirdWord
z forall a. Bits a => a -> Int -> a
`shiftL` Int
2 forall a. Bits a => a -> a -> a
.|. ThirdWord -> Word
part1by2 ThirdWord
y forall a. Bits a => a -> Int -> a
`shiftL` Int
1 forall a. Bits a => a -> a -> a
.|. ThirdWord -> Word
part1by2 ThirdWord
x
fromZCurve3 :: Word -> (ThirdWord, ThirdWord, ThirdWord)
fromZCurve3 :: Word -> (ThirdWord, ThirdWord, ThirdWord)
fromZCurve3 Word
z = (Word -> ThirdWord
compact1by2 Word
z, Word -> ThirdWord
compact1by2 (Word
z forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word -> ThirdWord
compact1by2 (Word
z forall a. Bits a => a -> Int -> a
`shiftR` Int
2))
contramapFromZCurve3
:: (ThirdWord -> ThirdWord -> ThirdWord -> a)
-> (Word -> a)
contramapFromZCurve3 :: forall a. (ThirdWord -> ThirdWord -> ThirdWord -> a) -> Word -> a
contramapFromZCurve3 ThirdWord -> ThirdWord -> ThirdWord -> a
f = forall {t} {t} {t} {t}. (t -> t -> t -> t) -> (t, t, t) -> t
uncurry3 ThirdWord -> ThirdWord -> ThirdWord -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> (ThirdWord, ThirdWord, ThirdWord)
fromZCurve3
where
uncurry3 :: (t -> t -> t -> t) -> (t, t, t) -> t
uncurry3 t -> t -> t -> t
func (t
a, t
b, t
c) = t -> t -> t -> t
func t
a t
b t
c
contramapToZCurve3
:: (Word -> a)
-> (ThirdWord -> ThirdWord -> ThirdWord -> a)
contramapToZCurve3 :: forall a. (Word -> a) -> ThirdWord -> ThirdWord -> ThirdWord -> a
contramapToZCurve3 Word -> a
f = ((Word -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. ThirdWord -> ThirdWord -> ThirdWord -> Word
toZCurve3
throughZCurveFix3
:: ((ThirdWord -> ThirdWord -> ThirdWord -> a) -> (ThirdWord -> ThirdWord -> ThirdWord -> a))
-> (Word -> a)
-> (Word -> a)
throughZCurveFix3 :: forall a.
((ThirdWord -> ThirdWord -> ThirdWord -> a)
-> ThirdWord -> ThirdWord -> ThirdWord -> a)
-> (Word -> a) -> Word -> a
throughZCurveFix3 (ThirdWord -> ThirdWord -> ThirdWord -> a)
-> ThirdWord -> ThirdWord -> ThirdWord -> a
f = forall a. (ThirdWord -> ThirdWord -> ThirdWord -> a) -> Word -> a
contramapFromZCurve3 forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ThirdWord -> ThirdWord -> ThirdWord -> a)
-> ThirdWord -> ThirdWord -> ThirdWord -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Word -> a) -> ThirdWord -> ThirdWord -> ThirdWord -> a
contramapToZCurve3
part1by1 :: HalfWord -> Word
part1by1 :: HalfWord -> Word
part1by1 HalfWord
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral HalfWord
x forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftL` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0x0000ffff0000ffff
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftL` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff00ff00ff00ff
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftL` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0x0f0f0f0f0f0f0f0f
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftL` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x3333333333333333
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftL` Int
1)) forall a. Bits a => a -> a -> a
.&. Word64
0x5555555555555555
part1by2 :: ThirdWord -> Word
part1by2 :: ThirdWord -> Word
part1by2 ThirdWord
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral ThirdWord
x forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftL` Int
32)) forall a. Bits a => a -> a -> a
.&. Word64
0xffff00000000ffff
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftL` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff0000ff0000ff
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftL` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0xf00f00f00f00f00f
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftL` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0x30c30c30c30c30c3
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftL` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x1249249249249249
compact1by1 :: Word -> HalfWord
compact1by1 :: Word -> HalfWord
compact1by1 Word
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
x forall a. Bits a => a -> a -> a
.&. Word64
0x5555555555555555
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftR` Int
1)) forall a. Bits a => a -> a -> a
.&. Word64
0x3333333333333333
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftR` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x0f0f0f0f0f0f0f0f
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftR` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff00ff00ff00ff
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftR` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0x0000ffff0000ffff
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftR` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff
compact1by2 :: Word -> ThirdWord
compact1by2 :: Word -> ThirdWord
compact1by2 Word
x = forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
x5 :: Word64)
where
x0 :: Word64
x0 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
x forall a. Bits a => a -> a -> a
.&. Word64
0x1249249249249249
x1 :: Word64
x1 = (Word64
x0 forall a. Bits a => a -> a -> a
`xor` (Word64
x0 forall a. Bits a => a -> Int -> a
`shiftR` Int
2)) forall a. Bits a => a -> a -> a
.&. Word64
0x30c30c30c30c30c3
x2 :: Word64
x2 = (Word64
x1 forall a. Bits a => a -> a -> a
`xor` (Word64
x1 forall a. Bits a => a -> Int -> a
`shiftR` Int
4)) forall a. Bits a => a -> a -> a
.&. Word64
0xf00f00f00f00f00f
x3 :: Word64
x3 = (Word64
x2 forall a. Bits a => a -> a -> a
`xor` (Word64
x2 forall a. Bits a => a -> Int -> a
`shiftR` Int
8)) forall a. Bits a => a -> a -> a
.&. Word64
0x00ff0000ff0000ff
x4 :: Word64
x4 = (Word64
x3 forall a. Bits a => a -> a -> a
`xor` (Word64
x3 forall a. Bits a => a -> Int -> a
`shiftR` Int
16)) forall a. Bits a => a -> a -> a
.&. Word64
0xffff00000000ffff
x5 :: Word64
x5 = (Word64
x4 forall a. Bits a => a -> a -> a
`xor` (Word64
x4 forall a. Bits a => a -> Int -> a
`shiftR` Int
32)) forall a. Bits a => a -> a -> a
.&. Word64
0x00000000ffffffff