module Sound.Iteratee.Utils (
interleave
)
where
import qualified Data.Vector.Storable as V
import Foreign.Storable
-- | interleave multiple vectors. The inputs must all have the same length,
-- else Nothing.
--
-- if there are no input vectors, output @Just V.empty@
interleave :: Storable a => [V.Vector a] -> Maybe (V.Vector a)
interleave [] = Just $ V.empty
interleave vecs = if all (== l) ls
then Just $ V.generate (nVecs * l) gFunc
else Nothing
where
(l:ls) = map V.length vecs
nVecs = length vecs
gFunc ix = let (frame,vec) = divMod ix nVecs
in (vecs !! vec) V.! frame
{-# INLINEABLE interleave #-}
-- this is probably not the most efficient, but it'll work for now