{-# language BangPatterns #-}
{-# language MagicHash #-}
{-# language UnboxedTuples #-}
{-# language DerivingStrategies #-}
module Data.Tuple.Types
(
DoublePair(..)
, IntPair(..)
, WordPair(..)
, ByteArrayPair(..)
, DoubleTriple(..)
, IntTriple(..)
, WordTriple(..)
, ByteArrayTriple(..)
) where
import Data.Primitive (ByteArray)
import Data.Primitive.Types (Prim)
import GHC.Exts ((+#),(*#))
import qualified Data.Primitive.Types as P
data DoublePair = DoublePair
{-# UNPACK #-} !Double
{-# UNPACK #-} !Double
deriving stock (Eq,Ord,Show)
data DoubleTriple = DoubleTriple
{-# UNPACK #-} !Double
{-# UNPACK #-} !Double
{-# UNPACK #-} !Double
deriving stock (Eq,Ord,Show)
data IntPair = IntPair
{-# UNPACK #-} !Int
{-# UNPACK #-} !Int
deriving stock (Eq,Ord,Show)
data IntTriple = IntTriple
{-# UNPACK #-} !Int
{-# UNPACK #-} !Int
{-# UNPACK #-} !Int
deriving stock (Eq,Ord,Show)
data WordPair = WordPair
{-# UNPACK #-} !Word
{-# UNPACK #-} !Word
deriving stock (Eq,Ord,Show)
data WordTriple = WordTriple
{-# UNPACK #-} !Word
{-# UNPACK #-} !Word
{-# UNPACK #-} !Word
deriving stock (Eq,Ord,Show)
data ByteArrayPair = ByteArrayPair
{-# UNPACK #-} !ByteArray
{-# UNPACK #-} !ByteArray
deriving stock (Eq,Ord,Show)
data ByteArrayTriple = ByteArrayTriple
{-# UNPACK #-} !ByteArray
{-# UNPACK #-} !ByteArray
{-# UNPACK #-} !ByteArray
deriving stock (Eq,Ord,Show)
instance Prim IntTriple where
{-# inline sizeOf# #-}
{-# inline alignment# #-}
{-# inline indexByteArray# #-}
{-# inline readByteArray# #-}
{-# inline writeByteArray# #-}
{-# inline setByteArray# #-}
{-# inline indexOffAddr# #-}
{-# inline readOffAddr# #-}
{-# inline writeOffAddr# #-}
{-# inline setOffAddr# #-}
sizeOf# _ = 3# *# P.sizeOf# (undefined :: Int)
alignment# _ = P.alignment# (undefined :: Int)
indexByteArray# arr# i# = IntTriple
(P.indexByteArray# arr# (3# *# i#))
(P.indexByteArray# arr# ((3# *# i#) +# 1#))
(P.indexByteArray# arr# ((3# *# i#) +# 2#))
readByteArray# arr# i# =
\s0 -> case P.readByteArray# arr# (3# *# i#) s0 of
(# s1, i0 #) -> case P.readByteArray# arr# ((3# *# i#) +# 1#) s1 of
(# s2, i1 #) -> case P.readByteArray# arr# ((3# *# i#) +# 2#) s2 of
(# s3, i2 #) -> (# s3, IntTriple i0 i1 i2 #)
writeByteArray# arr# i# (IntTriple a b c) =
\s0 -> case P.writeByteArray# arr# (3# *# i#) a s0 of
s1 -> case P.writeByteArray# arr# ((3# *# i#) +# 1#) b s1 of
s2 -> case P.writeByteArray# arr# ((3# *# i#) +# 2# ) c s2 of
s3 -> s3
setByteArray# = P.defaultSetByteArray#
indexOffAddr# arr# i# = IntTriple
(P.indexOffAddr# arr# (3# *# i#))
(P.indexOffAddr# arr# ((3# *# i#) +# 1#))
(P.indexOffAddr# arr# ((3# *# i#) +# 2#))
readOffAddr# arr# i# =
\s0 -> case P.readOffAddr# arr# (3# *# i#) s0 of
(# s1, i0 #) -> case P.readOffAddr# arr# ((3# *# i#) +# 1#) s1 of
(# s2, i1 #) -> case P.readOffAddr# arr# ((3# *# i#) +# 2#) s2 of
(# s3, i2 #) -> (# s3, IntTriple i0 i1 i2 #)
writeOffAddr# addr# i# (IntTriple a b c) =
\s0 -> case P.writeOffAddr# addr# (3# *# i#) a s0 of
s1 -> case P.writeOffAddr# addr# ((3# *# i#) +# 1#) b s1 of
s2 -> case P.writeOffAddr# addr# ((3# *# i#) +# 2# ) c s2 of
s3 -> s3
setOffAddr# = P.defaultSetOffAddr#
instance Prim WordTriple where
{-# inline sizeOf# #-}
{-# inline alignment# #-}
{-# inline indexByteArray# #-}
{-# inline readByteArray# #-}
{-# inline writeByteArray# #-}
{-# inline setByteArray# #-}
{-# inline indexOffAddr# #-}
{-# inline readOffAddr# #-}
{-# inline writeOffAddr# #-}
{-# inline setOffAddr# #-}
sizeOf# _ = 3# *# P.sizeOf# (undefined :: Word)
alignment# _ = P.alignment# (undefined :: Word)
indexByteArray# arr# i# = WordTriple
(P.indexByteArray# arr# (3# *# i#))
(P.indexByteArray# arr# ((3# *# i#) +# 1#))
(P.indexByteArray# arr# ((3# *# i#) +# 2#))
readByteArray# arr# i# =
\s0 -> case P.readByteArray# arr# (3# *# i#) s0 of
(# s1, i0 #) -> case P.readByteArray# arr# ((3# *# i#) +# 1#) s1 of
(# s2, i1 #) -> case P.readByteArray# arr# ((3# *# i#) +# 2#) s2 of
(# s3, i2 #) -> (# s3, WordTriple i0 i1 i2 #)
writeByteArray# arr# i# (WordTriple a b c) =
\s0 -> case P.writeByteArray# arr# (3# *# i#) a s0 of
s1 -> case P.writeByteArray# arr# ((3# *# i#) +# 1#) b s1 of
s2 -> case P.writeByteArray# arr# ((3# *# i#) +# 2# ) c s2 of
s3 -> s3
setByteArray# = P.defaultSetByteArray#
indexOffAddr# arr# i# = WordTriple
(P.indexOffAddr# arr# (3# *# i#))
(P.indexOffAddr# arr# ((3# *# i#) +# 1#))
(P.indexOffAddr# arr# ((3# *# i#) +# 2#))
readOffAddr# arr# i# =
\s0 -> case P.readOffAddr# arr# (3# *# i#) s0 of
(# s1, i0 #) -> case P.readOffAddr# arr# ((3# *# i#) +# 1#) s1 of
(# s2, i1 #) -> case P.readOffAddr# arr# ((3# *# i#) +# 2#) s2 of
(# s3, i2 #) -> (# s3, WordTriple i0 i1 i2 #)
writeOffAddr# addr# i# (WordTriple a b c) =
\s0 -> case P.writeOffAddr# addr# (3# *# i#) a s0 of
s1 -> case P.writeOffAddr# addr# ((3# *# i#) +# 1#) b s1 of
s2 -> case P.writeOffAddr# addr# ((3# *# i#) +# 2# ) c s2 of
s3 -> s3
setOffAddr# = P.defaultSetOffAddr#
instance Prim DoubleTriple where
{-# inline sizeOf# #-}
{-# inline alignment# #-}
{-# inline indexByteArray# #-}
{-# inline readByteArray# #-}
{-# inline writeByteArray# #-}
{-# inline setByteArray# #-}
{-# inline indexOffAddr# #-}
{-# inline readOffAddr# #-}
{-# inline writeOffAddr# #-}
{-# inline setOffAddr# #-}
sizeOf# _ = 3# *# P.sizeOf# (undefined :: Double)
alignment# _ = P.alignment# (undefined :: Double)
indexByteArray# arr# i# = DoubleTriple
(P.indexByteArray# arr# (3# *# i#))
(P.indexByteArray# arr# ((3# *# i#) +# 1#))
(P.indexByteArray# arr# ((3# *# i#) +# 2#))
readByteArray# arr# i# =
\s0 -> case P.readByteArray# arr# (3# *# i#) s0 of
(# s1, i0 #) -> case P.readByteArray# arr# ((3# *# i#) +# 1#) s1 of
(# s2, i1 #) -> case P.readByteArray# arr# ((3# *# i#) +# 2#) s2 of
(# s3, i2 #) -> (# s3, DoubleTriple i0 i1 i2 #)
writeByteArray# arr# i# (DoubleTriple a b c) =
\s0 -> case P.writeByteArray# arr# (3# *# i#) a s0 of
s1 -> case P.writeByteArray# arr# ((3# *# i#) +# 1#) b s1 of
s2 -> case P.writeByteArray# arr# ((3# *# i#) +# 2# ) c s2 of
s3 -> s3
setByteArray# = P.defaultSetByteArray#
indexOffAddr# arr# i# = DoubleTriple
(P.indexOffAddr# arr# (3# *# i#))
(P.indexOffAddr# arr# ((3# *# i#) +# 1#))
(P.indexOffAddr# arr# ((3# *# i#) +# 2#))
readOffAddr# arr# i# =
\s0 -> case P.readOffAddr# arr# (3# *# i#) s0 of
(# s1, i0 #) -> case P.readOffAddr# arr# ((3# *# i#) +# 1#) s1 of
(# s2, i1 #) -> case P.readOffAddr# arr# ((3# *# i#) +# 2#) s2 of
(# s3, i2 #) -> (# s3, DoubleTriple i0 i1 i2 #)
writeOffAddr# addr# i# (DoubleTriple a b c) =
\s0 -> case P.writeOffAddr# addr# (3# *# i#) a s0 of
s1 -> case P.writeOffAddr# addr# ((3# *# i#) +# 1#) b s1 of
s2 -> case P.writeOffAddr# addr# ((3# *# i#) +# 2# ) c s2 of
s3 -> s3
setOffAddr# = P.defaultSetOffAddr#
instance Prim DoublePair where
{-# inline sizeOf# #-}
{-# inline alignment# #-}
{-# inline indexByteArray# #-}
{-# inline readByteArray# #-}
{-# inline writeByteArray# #-}
{-# inline setByteArray# #-}
{-# inline indexOffAddr# #-}
{-# inline readOffAddr# #-}
{-# inline writeOffAddr# #-}
{-# inline setOffAddr# #-}
sizeOf# _ = 2# *# P.sizeOf# (undefined :: Double)
alignment# _ = P.alignment# (undefined :: Double)
indexByteArray# arr# i# = DoublePair
(P.indexByteArray# arr# (2# *# i#))
(P.indexByteArray# arr# ((2# *# i#) +# 1#))
readByteArray# arr# i# =
\s0 -> case P.readByteArray# arr# (2# *# i#) s0 of
(# s1, i0 #) -> case P.readByteArray# arr# ((2# *# i#) +# 1#) s1 of
(# s2, i1 #) -> (# s2, DoublePair i0 i1 #)
writeByteArray# arr# i# (DoublePair a b) =
\s0 -> case P.writeByteArray# arr# (2# *# i#) a s0 of
s1 -> case P.writeByteArray# arr# ((2# *# i#) +# 1#) b s1 of
s2 -> s2
setByteArray# = P.defaultSetByteArray#
indexOffAddr# arr# i# = DoublePair
(P.indexOffAddr# arr# (2# *# i#))
(P.indexOffAddr# arr# ((2# *# i#) +# 1#))
readOffAddr# arr# i# =
\s0 -> case P.readOffAddr# arr# (2# *# i#) s0 of
(# s1, i0 #) -> case P.readOffAddr# arr# ((2# *# i#) +# 1#) s1 of
(# s2, i1 #) -> (# s2, DoublePair i0 i1 #)
writeOffAddr# addr# i# (DoublePair a b) =
\s0 -> case P.writeOffAddr# addr# (2# *# i#) a s0 of
s1 -> case P.writeOffAddr# addr# ((2# *# i#) +# 1#) b s1 of
s2 -> s2
setOffAddr# = P.defaultSetOffAddr#
instance Prim IntPair where
{-# inline sizeOf# #-}
{-# inline alignment# #-}
{-# inline indexByteArray# #-}
{-# inline readByteArray# #-}
{-# inline writeByteArray# #-}
{-# inline setByteArray# #-}
{-# inline indexOffAddr# #-}
{-# inline readOffAddr# #-}
{-# inline writeOffAddr# #-}
{-# inline setOffAddr# #-}
sizeOf# _ = 2# *# P.sizeOf# (undefined :: Int)
alignment# _ = P.alignment# (undefined :: Int)
indexByteArray# arr# i# = IntPair
(P.indexByteArray# arr# (2# *# i#))
(P.indexByteArray# arr# ((2# *# i#) +# 1#))
readByteArray# arr# i# =
\s0 -> case P.readByteArray# arr# (2# *# i#) s0 of
(# s1, i0 #) -> case P.readByteArray# arr# ((2# *# i#) +# 1#) s1 of
(# s2, i1 #) -> (# s2, IntPair i0 i1 #)
writeByteArray# arr# i# (IntPair a b) =
\s0 -> case P.writeByteArray# arr# (2# *# i#) a s0 of
s1 -> case P.writeByteArray# arr# ((2# *# i#) +# 1#) b s1 of
s2 -> s2
setByteArray# = P.defaultSetByteArray#
indexOffAddr# arr# i# = IntPair
(P.indexOffAddr# arr# (2# *# i#))
(P.indexOffAddr# arr# ((2# *# i#) +# 1#))
readOffAddr# arr# i# =
\s0 -> case P.readOffAddr# arr# (2# *# i#) s0 of
(# s1, i0 #) -> case P.readOffAddr# arr# ((2# *# i#) +# 1#) s1 of
(# s2, i1 #) -> (# s2, IntPair i0 i1 #)
writeOffAddr# addr# i# (IntPair a b) =
\s0 -> case P.writeOffAddr# addr# (2# *# i#) a s0 of
s1 -> case P.writeOffAddr# addr# ((2# *# i#) +# 1#) b s1 of
s2 -> s2
setOffAddr# = P.defaultSetOffAddr#
instance Prim WordPair where
{-# inline sizeOf# #-}
{-# inline alignment# #-}
{-# inline indexByteArray# #-}
{-# inline readByteArray# #-}
{-# inline writeByteArray# #-}
{-# inline setByteArray# #-}
{-# inline indexOffAddr# #-}
{-# inline readOffAddr# #-}
{-# inline writeOffAddr# #-}
{-# inline setOffAddr# #-}
sizeOf# _ = 2# *# P.sizeOf# (undefined :: Int)
alignment# _ = P.alignment# (undefined :: Int)
indexByteArray# arr# i# = WordPair
(P.indexByteArray# arr# (2# *# i#))
(P.indexByteArray# arr# ((2# *# i#) +# 1#))
readByteArray# arr# i# =
\s0 -> case P.readByteArray# arr# (2# *# i#) s0 of
(# s1, i0 #) -> case P.readByteArray# arr# ((2# *# i#) +# 1#) s1 of
(# s2, i1 #) -> (# s2, WordPair i0 i1 #)
writeByteArray# arr# i# (WordPair a b) =
\s0 -> case P.writeByteArray# arr# (2# *# i#) a s0 of
s1 -> case P.writeByteArray# arr# ((2# *# i#) +# 1#) b s1 of
s2 -> s2
setByteArray# = P.defaultSetByteArray#
indexOffAddr# arr# i# = WordPair
(P.indexOffAddr# arr# (2# *# i#))
(P.indexOffAddr# arr# ((2# *# i#) +# 1#))
readOffAddr# arr# i# =
\s0 -> case P.readOffAddr# arr# (2# *# i#) s0 of
(# s1, i0 #) -> case P.readOffAddr# arr# ((2# *# i#) +# 1#) s1 of
(# s2, i1 #) -> (# s2, WordPair i0 i1 #)
writeOffAddr# addr# i# (WordPair a b) =
\s0 -> case P.writeOffAddr# addr# (2# *# i#) a s0 of
s1 -> case P.writeOffAddr# addr# ((2# *# i#) +# 1#) b s1 of
s2 -> s2
setOffAddr# = P.defaultSetOffAddr#