@@ -30,7 +30,7 @@ module Foreign.Matlab.Array (
30
30
mxArrayGet , mxArraySet ,
31
31
-- | array list access
32
32
mxArrayGetList , mxArraySetList ,
33
- mxArrayGetAll , mxArraySetAll ,
33
+ mxArrayGetAll , mxArraySetAll , mxArrayGetFirst ,
34
34
fromListIO , cellFromListsIO ,
35
35
36
36
-- * Struct access
@@ -71,14 +71,14 @@ type MNullArray = MXArray MNull
71
71
-- | Safely cast a generic array to a NULL array, or return Nothing if the array is not NULL
72
72
castMNull :: MAnyArray -> MIO (Maybe MNullArray )
73
73
castMNull a
74
- | isMNull a = return $ Just (unsafeCastMXArray a)
75
- | otherwise = return Nothing
74
+ | isMNull a = pure $ Just (unsafeCastMXArray a)
75
+ | otherwise = pure Nothing
76
76
77
77
foreign import ccall unsafe mxGetClassID :: MXArrayPtr -> IO MXClassID
78
78
-- | Return the representation of the type of the elements of an array
79
79
mxArrayClass :: MXArray a -> IO MXClass
80
80
mxArrayClass a
81
- | isMNull a = return $ MXClassNull
81
+ | isMNull a = pure $ MXClassNull
82
82
| otherwise = withMXArray a mxGetClassID >.= mx2hs
83
83
84
84
ndims :: MWSize -> Ptr MWSize -> IO MSize
@@ -114,8 +114,8 @@ mxArrayLength a = ii =.< withMXArray a mxGetNumberOfElements
114
114
foreign import ccall unsafe mxCalcSingleSubscript :: MXArrayPtr -> MWSize -> Ptr MWIndex -> IO MWIndex
115
115
-- | Convert an array subscript into an offset
116
116
mIndexOffset :: MXArray a -> MIndex -> MIO Int
117
- mIndexOffset _ (MSubs [] ) = return 0
118
- mIndexOffset _ (MSubs [i]) = return i
117
+ mIndexOffset _ (MSubs [] ) = pure 0
118
+ mIndexOffset _ (MSubs [i]) = pure i
119
119
mIndexOffset a (MSubs i) = ii =.< withMXArray a (withNSubs i . uncurry . mxCalcSingleSubscript)
120
120
121
121
foreign import ccall unsafe mxDuplicateArray :: MXArrayPtr -> IO MXArrayPtr
@@ -176,7 +176,7 @@ class MXArrayComponent a where
176
176
-- | Create a row vector from the given list.
177
177
createRowVector :: [a ] -> MIO (MXArray a )
178
178
179
- isMXArray _ = return False
179
+ isMXArray _ = pure False
180
180
isMXScalar a = liftM2 (&&) (isMXArray a) (all (1 == ) =.< mxArraySize a)
181
181
182
182
mxArrayGetOffsetList a o n = mapM (mxArrayGetOffset a) [o.. o+ n- 1 ]
@@ -187,15 +187,15 @@ class MXArrayComponent a where
187
187
createMXScalar x = do
188
188
a <- createMXArray [1 ]
189
189
mxArraySetOffset a 0 x
190
- return a
190
+ pure a
191
191
createRowVector l = do
192
192
a <- createMXArray [1 ,length l]
193
193
mxArraySetOffsetList a 0 l
194
- return a
194
+ pure a
195
195
createColVector l = do
196
196
a <- createMXArray [length l]
197
197
mxArraySetOffsetList a 0 l
198
- return a
198
+ pure a
199
199
200
200
-- | Get the value of the specified array element. Does not check bounds.
201
201
mxArrayGet :: MXArrayComponent a => MXArray a -> MIndex -> MIO a
@@ -210,7 +210,7 @@ mxArraySet a i v = do
210
210
mxArrayGetList :: MXArrayComponent a => MXArray a -> MIndex -> Int -> MIO [a ]
211
211
mxArrayGetList a i n = do
212
212
o <- mIndexOffset a i
213
- n <- if n == - 1 then subtract o =.< mxArrayLength a else return n
213
+ n <- if n == - 1 then subtract o =.< mxArrayLength a else pure n
214
214
mxArrayGetOffsetList a o n
215
215
-- | @'mxArraySetList' a i l@ sets the sequential items in array @a@ starting at index @i@ to @l@. Does not check bounds.
216
216
mxArraySetList :: MXArrayComponent a => MXArray a -> MIndex -> [a ] -> MIO ()
@@ -226,13 +226,18 @@ mxArrayGetAll a = mxArrayGetList a mStart (-1)
226
226
mxArraySetAll :: MXArrayComponent a => MXArray a -> [a ] -> IO ()
227
227
mxArraySetAll a = mxArraySetList a mStart
228
228
229
+ mxArrayGetFirst :: MXArrayComponent a => MXArray a -> MIO (Either String a )
230
+ mxArrayGetFirst arr
231
+ | isMNull arr = pure $ Left " Couldn't get first element of null array"
232
+ | otherwise = Right <$> mxArrayGetOffset arr 0
233
+
229
234
-- | Safely cast a generic array to a type, or return Nothing if the array does not have the proper type
230
235
castMXArray :: forall a . MXArrayComponent a => MAnyArray -> MIO (Maybe (MXArray a ))
231
236
castMXArray a
232
- | isMNull a = return Nothing
237
+ | isMNull a = pure Nothing
233
238
| otherwise = do
234
239
y <- isMXArray b
235
- return $ if y then Just b else Nothing
240
+ pure $ if y then Just b else Nothing
236
241
where
237
242
b :: MXArray a
238
243
b = unsafeCastMXArray a
@@ -386,7 +391,8 @@ foreign import ccall unsafe mxSetField :: MXArrayPtr -> MWIndex -> CString -> MX
386
391
foreign import ccall unsafe mxGetFieldByNumber :: MXArrayPtr -> MWIndex -> CInt -> IO MXArrayPtr
387
392
foreign import ccall unsafe mxSetFieldByNumber :: MXArrayPtr -> MWIndex -> CInt -> MXArrayPtr -> IO ()
388
393
389
- -- |Return the contents of the named field for the given element. Returns 'MNullArray' on no such field or if the field itself is NULL
394
+ -- |Return the contents of the named field for the given element.
395
+ -- |Returns 'MNullArray' on no such field or if the field itself is NULL
390
396
mStructGet :: MStructArray -> MIndex -> String -> MIO MAnyArray
391
397
-- |Sets the contents of the named field for the given element. The input is stored in the array -- no copy is made.
392
398
mStructSet :: MStructArray -> MIndex -> String -> MXArray a -> MIO ()
@@ -435,7 +441,7 @@ instance MXArrayComponent MStruct where
435
441
createMXScalar (MStruct fv) = do
436
442
a <- createStruct [1] f
437
443
withMXArray a $ \a -> zipWithM_ (\i v -> withMXArray v (mxSetFieldByNumber a 0 i)) [0..] v
438
- return a
444
+ pure a
439
445
where
440
446
(f,v) = unzip fv
441
447
@@ -446,7 +452,7 @@ mObjectGetClass a = do
446
452
b <- boolC =.< withMXArray a mxIsObject
447
453
if b
448
454
then Just =.< withMXArray a (mxGetClassName >=> peekCString)
449
- else return Nothing
455
+ else pure Nothing
450
456
451
457
foreign import ccall unsafe mxSetClassName :: MXArrayPtr -> CString -> IO CInt
452
458
-- |Set classname of an unvalidated object array. It is illegal to call this function on a previously validated object array.
@@ -476,14 +482,14 @@ instance (RealFloat a, MNumeric a, MXArrayData mx a) => MXArrayComponent (MCompl
476
482
mxArrayGetOffset a o = do
477
483
r <- withRealDataOff a o (mx2hs .=< peek)
478
484
c <- withImagDataOff a o (mx2hs .=< peek)
479
- return $ r :+ c
485
+ pure $ r :+ c
480
486
mxArraySetOffset a o (r :+ c) = do
481
487
withRealDataOff a o (\p -> poke p (hs2mx r))
482
488
withImagDataOff a o (\p -> poke p (hs2mx c))
483
489
mxArrayGetOffsetList a o n = do
484
490
r <- withRealDataOff a o (map mx2hs .=< peekArray n)
485
491
c <- withImagDataOff a o (map mx2hs .=< peekArray n)
486
- return $ zipWith (:+) r c
492
+ pure $ zipWith (:+) r c
487
493
mxArraySetOffsetList a o v = do
488
494
withRealDataOff a o (\p -> pokeArray p (map hs2mx r))
489
495
withImagDataOff a o (\p -> pokeArray p (map hs2mx c))
0 commit comments