module Sound.SDIF.Matrix where
import qualified Data.ByteString.Lazy as B
import Sound.SDIF.Byte.Matrix
import Sound.SDIF.Type
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 :: 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"
list_section :: [a] -> Int -> Int -> [a]
list_section xs i j = take (j i) (drop i xs)
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)
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 []