system-uuid-0.0.0: System/UUID/FromForeign.hs
{-| Utilities for fetching the results from foreign functions.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}
{-# LANGUAGE ForeignFunctionInterface
#-}
module System.UUID.FromForeign
( runAndRead
) where
import Data.UUID.Bytes
import Foreign.C
import Foreign.ForeignPtr
import Foreign
{-| Allocate a pointer to capture the output of a foreign function, run the
- function and interpret the sixteen bytes following the pointer as a UUID.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}
runAndRead :: (Ptr CChar -> IO ()) -> IO UUID
runAndRead procedure = do
fp <- mallocForeignPtrArray 16
withForeignPtr fp procedure
bytes <- withForeignPtr fp $ peekArray 16 . castPtr
let
[x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xA, xB, xC, xD, xE, xF]
= bytes
return $ UUID x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF