module Foreign.Matlab.Util where
import Control.Monad
import Foreign
infixl 1 >., >.=, >=.
infixr 1 =.<, .=<
(>.) :: Monad m => m a -> b -> m b
(>.=) :: Monad m => m a -> (a -> b) -> m b
(=.<) :: Monad m => (a -> b) -> m a -> m b
(>=.) :: Monad m => (a -> m b) -> (b -> c) -> a -> m c
(.=<) :: Monad m => (b -> c) -> (a -> m b) -> a -> m c
(>.) e r = e >> return r
(>.=) e r = e >>= return . r
(=.<) r e = return . r =<< e
(>=.) e r = e >=> return . r
(.=<) r e = return . r <=< e
ii :: (Integral a, Integral b) => a -> b
ii = fromIntegral
type With x y a = x -> (y -> a) -> a
mapWith :: With x y a -> With [x] [y] a
mapWith w l f = m l id where
m [] s = f (s [])
m (x:l) s = w x (\y -> m l (s.(y:)))
mapWith' :: With x y a -> With [x] [y] a
mapWith' w = m where
m [] e = e []
m (x:l) e = m l (\s -> w x (\y -> e (y:s)))
mapWithRev :: With x y a -> With [x] [y] a
mapWithRev w l f = m l [] where
m [] s = f s
m (x:l) s = w x (\y -> m l (y:s))
mapWithArray :: Storable y => With x y (IO a) -> With [x] (Ptr y) (IO a)
mapWithArray w l f = mapWithArrayLen w l (\(p,_) -> f p)
mapWithArrayLen :: Storable y => With x y (IO a) -> With [x] (Ptr y, Int) (IO a)
mapWithArrayLen w l f =
allocaArray (length l) $ \p ->
let
set [] i = f (p,i)
set (x:l) i = w x $ \y -> pokeElemOff p i y >> set l (succ i)
in set l 0
segment :: Int -> [a] -> [[a]]
segment _ [] = []
segment n l = a : segment n r where (a,r) = splitAt n l
replaceIndex :: [a] -> Int -> a -> [a]
replaceIndex [] _ _ = error "replaceIndex: index too large"
replaceIndex (_:l) 0 y = y:l
replaceIndex (x:l) n y = x : replaceIndex l (pred n) y