Skip to content

Commit 395c2bd

Browse files
committed
change representation of MStruct to Data.Map.Strict from list of kvs; fixes #17
1 parent b69f853 commit 395c2bd

File tree

5 files changed

+56
-31
lines changed

5 files changed

+56
-31
lines changed

Foreign/Matlab/Array.hsc

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ module Foreign.Matlab.Array (
3131
-- | array list access
3232
mxArrayGetList, mxArraySetList,
3333
mxArrayGetAll, mxArraySetAll,
34-
mxArrayGetSafe, mxArrayGetFirst, mxArrayGetLast,
34+
mxArrayGetOffsetSafe, mxArrayGetFirst, mxArrayGetLast,
35+
-- mxArrayGetSafe, --TODO--
3536
fromListIO, cellFromListsIO,
3637
isMNull,
3738

@@ -51,16 +52,17 @@ module Foreign.Matlab.Array (
5152
mObjectGetClass, mObjectSetClass
5253
) where
5354

54-
import Control.Monad
55-
import Data.Foldable (toList)
56-
import Foreign
57-
import Foreign.C.String
58-
import Foreign.C.Types
59-
import Data.Complex
60-
import Data.Maybe (catMaybes)
61-
import Foreign.Matlab.Util
62-
import Foreign.Matlab.Internal
63-
import Foreign.Matlab.Types
55+
import Control.Monad
56+
import Data.Foldable (toList)
57+
import Foreign
58+
import Foreign.C.String
59+
import Foreign.C.Types
60+
import Data.Complex
61+
import qualified Data.Map.Strict as DM
62+
import Data.Maybe (catMaybes)
63+
import Foreign.Matlab.Util
64+
import Foreign.Matlab.Internal
65+
import Foreign.Matlab.Types
6466

6567
#include <matrix.h>
6668

@@ -231,16 +233,16 @@ mxArraySetAll :: MXArrayComponent a => MXArray a -> [a] -> IO ()
231233
mxArraySetAll a = mxArraySetList a mStart
232234

233235
mxArrayGetFirst :: MXArrayComponent a => MXArray a -> MIO (Either String a)
234-
mxArrayGetFirst arr = mxArrayGetSafe arr 0
236+
mxArrayGetFirst arr = mxArrayGetOffsetSafe arr 0
235237

236238
mxArrayGetLast :: MXArrayComponent a => MXArray a -> MIO (Either String a)
237239
mxArrayGetLast arr = do
238240
arrLen <- mxArrayLength arr
239-
mxArrayGetSafe arr (arrLen - 1)
241+
mxArrayGetOffsetSafe arr (arrLen - 1)
240242

241243
-- |Like mxArrayGetOffset but safe.
242-
mxArrayGetSafe :: forall a. MXArrayComponent a => MXArray a -> Int -> MIO (Either String a)
243-
mxArrayGetSafe arr ix
244+
mxArrayGetOffsetSafe :: forall a. MXArrayComponent a => MXArray a -> Int -> MIO (Either String a)
245+
mxArrayGetOffsetSafe arr ix
244246
| isMNull arr = pure $ Left "Couldn't get element of null array"
245247
| otherwise = do
246248
arrLen <- mxArrayLength arr
@@ -441,7 +443,8 @@ mStructRemoveField a f = withMXArray a $ \a -> do
441443
442444
structGetOffsetFields :: MStructArray -> [String] -> Int -> IO MStruct
443445
structGetOffsetFields a f o =
444-
MStruct =.< withMXArray a (\a -> zipWithM (\f -> ((,) f) .=< (mxGetFieldByNumber a (ii o) >=> mkMXArray)) f [0..])
446+
MStruct =.< withMXArray a (\a -> DM.fromList <$>
447+
(zipWithM (\f -> ((,) f) .=< (mxGetFieldByNumber a (ii o) >=> mkMXArray)) f [0..]))
445448
446449
-- |Set the fields of a struct index to the given value list. The list corresponds to the field list and must match in size.
447450
mStructSetFields :: MStructArray -> MIndex -> [MXArray a] -> MIO ()
@@ -464,7 +467,7 @@ instance MXArrayComponent MStruct where
464467
withMXArray a $ \a -> zipWithM_ (\i v -> withMXArray v (mxSetFieldByNumber a 0 i)) [0..] v
465468
pure a
466469
where
467-
(f,v) = unzip fv
470+
(f,v) = unzip $ DM.toList fv
468471
469472
foreign import ccall unsafe mxGetClassName :: MXArrayPtr -> IO CString
470473
-- |Determine if a struct array is a user defined object, and return its class name, if any.

Foreign/Matlab/Array/IMX.hs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ module Foreign.Matlab.Array.IMX (
2323
imxStructList
2424
) where
2525

26-
import Control.Monad
27-
import Data.Array.IArray
28-
import Data.Complex
29-
import Data.List
30-
import Foreign.Matlab.Util
31-
import Foreign.Matlab.Internal
32-
import Foreign.Matlab.Types
33-
import Foreign.Matlab.Array
26+
import Control.Monad
27+
import Data.Array.IArray
28+
import Data.Complex
29+
import Data.List
30+
import qualified Data.Map.Strict as DM
31+
import Foreign.Matlab.Util
32+
import Foreign.Matlab.Internal
33+
import Foreign.Matlab.Types
34+
import Foreign.Matlab.Array
3435

3536
type IMXArray a = Array MIndex a
3637
-- |The basic immutable (functional) representation of Matlab data structures, representing a generic 'MXArray'
@@ -153,8 +154,8 @@ imxData a = do
153154
imxc MXClassStruct False = do
154155
s <- mxArraySize a'
155156
fv <- mxArrayGetAll a'
156-
f <- if null fv then mStructFields a' else return (map fst (mStruct (head fv)))
157-
listIMXStruct f s =.< mapM imxData (concatMap (map snd . mStruct) fv)
157+
f <- if null fv then mStructFields a' else return (map fst (DM.toList $ mStruct (head fv)))
158+
listIMXStruct f s =.< mapM imxData (concatMap (map snd . DM.toList . mStruct) fv)
158159
imxc MXClassLogical False = IMXLogical =.< imxa return
159160
imxc MXClassChar False = IMXChar =.< imxa return
160161
imxc MXClassDouble False = IMXDouble =.< imxa return

Foreign/Matlab/Internal.hsc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ module Foreign.Matlab.Internal (
2727
MWSize, MWIndex, MWSignedIndex
2828
) where
2929

30-
import Foreign
31-
import Foreign.C.Types
30+
import qualified Data.Map.Strict as DM
31+
import Foreign
32+
import Foreign.C.Types
3233
import qualified Data.Char
33-
import Foreign.Matlab.Util
34+
import Foreign.Matlab.Util
3435

3536
#include <matrix.h>
3637

@@ -193,7 +194,7 @@ instance MType MCell MCell where
193194
mxClassOf _ = MXClassCell
194195
195196
-- |A single struct in an array, represented by an (ordered) list of key-value pairs
196-
newtype MStruct = MStruct { mStruct :: [(String,MAnyArray)] }
197+
newtype MStruct = MStruct { mStruct :: DM.Map String MAnyArray }
197198
instance MType MStruct MStruct where
198199
hs2mx = id
199200
mx2hs = id

Foreign/Matlab/Types.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ module Foreign.Matlab.Types (
4141
MFun
4242
) where
4343

44+
4445
import Data.Complex
4546
import Data.Ix
4647
import Foreign.Matlab.Internal

attic/Array_interpreter.hs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
data StructPath =
2+
SField String
3+
| SIx MIndex
4+
-- | SList [SField] -- Consider this for later, would require merging and likely runtime errors
5+
6+
data StructTerm =
7+
8+
-- | Convenience tool to automate extraction of MATLAB datastructures.
9+
mxGetPath :: (MXArrayComponent a, MXArrayComponent b)
10+
=> [StructPath] -> MXArray a -> MIO (Either String (MXArray b))
11+
mxGetPath pathCur:pathRest arr = do
12+
mxGetPath pathCur:[] arr = do
13+
14+
-- TODO - how to dwe deal with the type of non-MXArray vs MXArray in retrievals?
15+
-- TODO: maye a new class that includes both options?
16+
17+
mxGetPathPart :: (MXArrayComponent a) => StructPath -> MXArray a -> MIO (Either String MAnyArray)
18+
mxGetPathPart (SField field) arr = do
19+
mxGetPathPart (SIx ix) arr = do

0 commit comments

Comments
 (0)