module Bindings.Utilities (
storableCast,
storableCastArray,
) where
import Foreign.C
import Foreign.Marshal
import Foreign.Ptr
import Foreign.Storable
storableCast :: (Storable a, Storable b) => a -> IO b
storableCast :: forall a b. (Storable a, Storable b) => a -> IO b
storableCast a
a = [a] -> IO [b]
forall a b. (Storable a, Storable b) => [a] -> IO [b]
storableCastArray [a
a] IO [b] -> ([b] -> IO b) -> IO b
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (b -> IO b
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> IO b) -> ([b] -> b) -> [b] -> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> b
forall a. HasCallStack => [a] -> a
head)
storableCastArray :: (Storable a, Storable b) => [a] -> IO [b]
storableCastArray :: forall a b. (Storable a, Storable b) => [a] -> IO [b]
storableCastArray [] = [b] -> IO [b]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
storableCastArray [a]
a = do
b
u <- b -> IO b
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return b
forall a. HasCallStack => a
undefined
let (Int
q,Int
r) = Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
divMod ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
a Int -> Int -> Int
forall a. Num a => a -> a -> a
* (a -> Int
forall a. Storable a => a -> Int
sizeOf (a -> Int) -> ([a] -> a) -> [a] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> a
forall a. HasCallStack => [a] -> a
head) [a]
a) (b -> Int
forall a. Storable a => a -> Int
sizeOf b
u)
let len :: Int
len = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (if Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 then Int
q Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 else Int
q)
let blank :: [CChar]
blank = Int -> CChar -> [CChar]
forall a. Int -> a -> [a]
replicate (Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
* b -> Int
forall a. Storable a => a -> Int
sizeOf b
u) (CChar
0::CChar)
[b]
b <- [CChar] -> (Ptr CChar -> IO [b]) -> IO [b]
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray [CChar]
blank ((Ptr CChar -> IO [b]) -> IO [b])
-> (Ptr CChar -> IO [b]) -> IO [b]
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
ptr -> do
Ptr a -> [a] -> IO ()
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray (Ptr CChar -> Ptr a
forall a b. Ptr a -> Ptr b
castPtr Ptr CChar
ptr) [a]
a
Int -> Ptr b -> IO [b]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
len (Ptr CChar -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr CChar
ptr)
[b] -> IO [b]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([b] -> IO [b]) -> [b] -> IO [b]
forall a b. (a -> b) -> a -> b
$ if Bool
True then [b]
b else [b
u]