-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFFI.hs
38 lines (30 loc) · 1.58 KB
/
FFI.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{-# LANGUAGE ForeignFunctionInterface #-}
module FFI where
{-- Модуль со средствами пострения межъязыковых интерфейсов --}
import Foreign.C.Types
import Foreign.Marshal.Array
import Foreign.Marshal.Unsafe
import Foreign.Ptr
import Foreign.Storable
import Data.Typeable
import Unsafe.Coerce
--Преобразование типов. Используется для преобразования
--типов одного языка в типы второго.
coerce :: a -> b
coerce = unsafeCoerce
--Преобразовать массив заданной длинны в список
readVector :: Storable a => CInt -> Ptr a -> [b]
readVector len0 arr = map coerce rawlist where
len = fromIntegral len0
rawlist = unsafeLocalState $ peekArray len arr
--Преобразовать двумерный массив заданных размеров в двумерный список
readMatrix :: Storable a => CInt -> CInt -> Ptr (Ptr a) -> [[b]]
readMatrix n0 m0 arr = map (readVector n0) ptrlist where
m = fromIntegral m0
ptrlist = unsafeLocalState $ peekArray m arr
--Преобразовать вектор в массив
writeVector :: (Storable a, Storable b) => [a] -> Ptr b
writeVector v = unsafeLocalState $ newArray (map coerce v)
--Преобразовать двумерный список в двумерный массив
writeMatrix :: (Storable a, Storable b) => [[a]] -> Ptr (Ptr b)
writeMatrix m = unsafeLocalState $ newArray (map writeVector m)