hsdif-0.11: Sound/SDIF/Matrix.hs
-- | SDIF matrix functions.
module Sound.SDIF.Matrix where
import qualified Data.ByteString.Lazy as B
import Sound.SDIF.Byte.Matrix
import Sound.SDIF.Type
-- | SDIF matrix data store.
data Matrix = Matrix { matrix_b :: B.ByteString
, matrix_type :: String
, matrix_data_type :: Int
, matrix_rows :: Int
, matrix_columns :: Int
, matrix_elements :: Int
, matrix_data_size :: Int
, matrix_storage_size :: Int
, matrix_v :: [Datum] }
deriving (Eq, Show)
-- | Decode 'Matrix'.
decode_matrix :: B.ByteString -> Matrix
decode_matrix mtx =
let m = Matrix { matrix_b = mtx
, matrix_type = matrix_b_type mtx
, matrix_data_type = matrix_b_data_type mtx
, matrix_rows = matrix_b_rows mtx
, matrix_columns = matrix_b_columns mtx
, matrix_elements = matrix_b_elements mtx
, matrix_data_size = matrix_b_data_size mtx
, matrix_storage_size = matrix_b_storage_size mtx
, matrix_v = matrix_b_to_matrix_v mtx }
in if is_matrix_b mtx
then m
else error "decode_matrix: illegal data"
-- | Section of list from /i/th to /j/th indices.
--
-- > list_section [1..9] 4 6 == [5,6]
list_section :: [a] -> Int -> Int -> [a]
list_section xs i j = take (j - i) (drop i xs)
-- | Extract /n/th row of 'Matrix'.
matrix_row :: Matrix -> Int -> [Datum]
matrix_row m n =
let r = matrix_rows m
c = matrix_columns m
i = n * c
in if n >= r
then error "matrix_row: domain error"
else list_section (matrix_v m) i (i + c)
-- | Extract /n/th column of 'Matrix'.
matrix_column :: Matrix -> Int -> [Datum]
matrix_column m n =
let nr = matrix_rows m
nc = matrix_columns m
v = matrix_v m
build i xs =
if i == nr
then reverse xs
else build (i + 1) ((v !! (n + (i * nc))) : xs)
in if n >= nc
then error "matrix_column: domain error"
else build 0 []