module GridBox.Compress
( Length
, CompressedGrid
, CompressedRow
, CompressedCols
, CompressedCol
, compressGrid
, compressRow
, compressBoxes
, compressGroupedRows
, compressGroupedRow
, compressCols
, fromCols
, mergeCols
) where
import GridBox.Grid (Grid)
import GridBox.Row (Row)
import GridBox.Box (Box, BoxRow, BoxCol)
import GridBox.Grouping (GroupedRow, GroupedByRow, groupBoxesByRow)
type Length = Int
type CompressedGrid = [CompressedRow]
type CompressedRow = (BoxRow, CompressedCols)
type CompressedCols = [CompressedCol]
type CompressedCol = (BoxCol, Length)
compressGrid :: Grid -> CompressedGrid
compressGrid = compressBoxes . concat
compressRow :: Row -> CompressedGrid
compressRow = compressBoxes
compressBoxes :: [Box] -> CompressedGrid
compressBoxes boxes =
compressGroupedRows $ groupBoxesByRow boxes
compressGroupedRows :: GroupedByRow -> CompressedGrid
compressGroupedRows rows =
map compressGroupedRow rows
compressGroupedRow :: GroupedRow -> CompressedRow
compressGroupedRow (a, cols) =
(a, compressCols cols)
compressCols :: [BoxCol] -> CompressedCols
compressCols =
mergeCols . fromCols
fromCols :: [BoxCol] -> CompressedCols
fromCols =
map (\l -> (l, 1))
mergeCols :: CompressedCols -> CompressedCols
mergeCols [] = []
mergeCols (a:[]) = [a]
mergeCols ((ac, al):(bc, bl):xs)
| ac == bc al = mergeCols $ (ac, al+bl):xs
| otherwise = (ac, al) : (mergeCols $ (bc, bl):xs)