module Foreign.Storable.Tuple where

import qualified Foreign.Storable.Newtype as Newtype
import Foreign.Storable.Record.Tuple (Tuple(Tuple, getTuple))
import Foreign.Storable (Storable, sizeOf, alignment, peek, poke)
import Data.Orphans ()


instance (Storable a, Storable b) => Storable (a,b) where
   {-# INLINABLE sizeOf #-}
   sizeOf :: (a, b) -> Int
sizeOf    = forall core wrapper.
Storable core =>
(wrapper -> core) -> wrapper -> Int
Newtype.sizeOf forall a. a -> Tuple a
Tuple
   {-# INLINABLE alignment #-}
   alignment :: (a, b) -> Int
alignment = forall core wrapper.
Storable core =>
(wrapper -> core) -> wrapper -> Int
Newtype.alignment forall a. a -> Tuple a
Tuple
   {-# INLINABLE peek #-}
   peek :: Ptr (a, b) -> IO (a, b)
peek      = forall core wrapper.
Storable core =>
(core -> wrapper) -> Ptr wrapper -> IO wrapper
Newtype.peek forall a. Tuple a -> a
getTuple
   {-# INLINABLE poke #-}
   poke :: Ptr (a, b) -> (a, b) -> IO ()
poke      = forall core wrapper.
Storable core =>
(wrapper -> core) -> Ptr wrapper -> wrapper -> IO ()
Newtype.poke forall a. a -> Tuple a
Tuple

instance (Storable a, Storable b, Storable c) => Storable (a,b,c) where
   {-# INLINABLE sizeOf #-}
   sizeOf :: (a, b, c) -> Int
sizeOf    = forall core wrapper.
Storable core =>
(wrapper -> core) -> wrapper -> Int
Newtype.sizeOf forall a. a -> Tuple a
Tuple
   {-# INLINABLE alignment #-}
   alignment :: (a, b, c) -> Int
alignment = forall core wrapper.
Storable core =>
(wrapper -> core) -> wrapper -> Int
Newtype.alignment forall a. a -> Tuple a
Tuple
   {-# INLINABLE peek #-}
   peek :: Ptr (a, b, c) -> IO (a, b, c)
peek      = forall core wrapper.
Storable core =>
(core -> wrapper) -> Ptr wrapper -> IO wrapper
Newtype.peek forall a. Tuple a -> a
getTuple
   {-# INLINABLE poke #-}
   poke :: Ptr (a, b, c) -> (a, b, c) -> IO ()
poke      = forall core wrapper.
Storable core =>
(wrapper -> core) -> Ptr wrapper -> wrapper -> IO ()
Newtype.poke forall a. a -> Tuple a
Tuple

instance
   (Storable a, Storable b, Storable c, Storable d) =>
      Storable (a,b,c,d) where
   {-# INLINABLE sizeOf #-}
   sizeOf :: (a, b, c, d) -> Int
sizeOf    = forall core wrapper.
Storable core =>
(wrapper -> core) -> wrapper -> Int
Newtype.sizeOf forall a. a -> Tuple a
Tuple
   {-# INLINABLE alignment #-}
   alignment :: (a, b, c, d) -> Int
alignment = forall core wrapper.
Storable core =>
(wrapper -> core) -> wrapper -> Int
Newtype.alignment forall a. a -> Tuple a
Tuple
   {-# INLINABLE peek #-}
   peek :: Ptr (a, b, c, d) -> IO (a, b, c, d)
peek      = forall core wrapper.
Storable core =>
(core -> wrapper) -> Ptr wrapper -> IO wrapper
Newtype.peek forall a. Tuple a -> a
getTuple
   {-# INLINABLE poke #-}
   poke :: Ptr (a, b, c, d) -> (a, b, c, d) -> IO ()
poke      = forall core wrapper.
Storable core =>
(wrapper -> core) -> Ptr wrapper -> wrapper -> IO ()
Newtype.poke forall a. a -> Tuple a
Tuple