summaryrefslogtreecommitdiff
path: root/contrib/haskell/src/Hkl/C/DArray.hsc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/haskell/src/Hkl/C/DArray.hsc')
-rw-r--r--contrib/haskell/src/Hkl/C/DArray.hsc25
1 files changed, 25 insertions, 0 deletions
diff --git a/contrib/haskell/src/Hkl/C/DArray.hsc b/contrib/haskell/src/Hkl/C/DArray.hsc
new file mode 100644
index 0000000..82520ee
--- /dev/null
+++ b/contrib/haskell/src/Hkl/C/DArray.hsc
@@ -0,0 +1,25 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+
+module Hkl.C.DArray
+ (DArray(..)) where
+
+import Foreign (peekArray)
+import Foreign.C (CSize, CString)
+import Foreign.Storable (Storable(..))
+
+#include "hkl.h"
+
+#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)
+
+data DArray a = DArray CSize [a] deriving Show
+
+instance Storable (DArray CString) where
+ alignment _ = #{alignment darray_string}
+ sizeOf _ = #{size darray_string}
+ peek ptr = do
+ n <- (#{peek darray_string, size} ptr)
+ items <- #{peek darray_string ,item} ptr
+ ss <- peekArray (fromEnum n) items
+ return $ DArray n ss