{-# LANGUAGE AllowAmbiguousTypes
, DataKinds
, KindSignatures
, MultiParamTypeClasses
, Rank2Types
, ScopedTypeVariables
, TypeApplications #-}
module Foreign.Storable.Offset
(
Offset (..)
, offset
, pokeField
) where
import Foreign.Ptr
import Foreign.Storable
import GHC.Records
import GHC.TypeLits
class Offset (x :: Symbol) r where
rawOffset :: Int
offset :: forall x r a. (HasField x r a, Offset x r) => Ptr r -> Ptr a
offset :: Ptr r -> Ptr a
offset = (Ptr r -> Int -> Ptr a
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Offset x r => Int
forall (x :: Symbol) r. Offset x r => Int
rawOffset @x @r)
pokeField :: forall x r a. (HasField x r a, Offset x r, Storable a) => Ptr r -> r -> IO ()
pokeField :: Ptr r -> r -> IO ()
pokeField Ptr r
ptr = Ptr a -> a -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr r -> Ptr a
forall (x :: Symbol) r a.
(HasField x r a, Offset x r) =>
Ptr r -> Ptr a
offset @x @r Ptr r
ptr) (a -> IO ()) -> (r -> a) -> r -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasField x r a => r -> a
forall k (x :: k) r a. HasField x r a => r -> a
getField @x @r