module Sound.Signal.StrictBlock where
import Data.Array.Unboxed (UArray)
import Data.Array.IArray (IArray, ixmap, bounds, elems, listArray)
import qualified Data.List as List
import Prelude hiding ((++), iterate, foldl)
data T a = Cons {
offset :: Int,
chunks :: [UArray Int a]
}
toChunkList :: (IArray UArray a) => T a -> [UArray Int a]
toChunkList (Cons k (x:xs)) =
ixmap (let (0,n) = bounds x in (0,nk)) (k+) x
: xs
toChunkList (Cons 0 []) = []
toChunkList _ =
error "Sound.Signal.Block: invalid empty structure"
singleton :: (IArray UArray a) => a -> T a
singleton x = Cons 0 [listArray (0,0) [x]]
foldl' :: (IArray UArray a) => (acc -> a -> acc) -> acc -> T a -> acc
foldl' f start =
List.foldl' (\acc -> List.foldl' f acc . elems) start . toChunkList
(++) :: (IArray UArray a) => T a -> T a -> T a
(Cons k x) ++ y = Cons k (x List.++ toChunkList y)