shamochu-0.1.0.0: “Shuffle and merge overlapping chunks” lossless compression
Copyright(c) 2024 Pierre Le Marre
LicenseBSD-3
Maintainerdev@wismill.eu
Stabilityexperimental
Safe HaskellSafe-Inferred
LanguageGHC2021

Shamochu

Description

Shamochu is short for “Shuffle and merge overlapping chunks lossless compression”.

See the package description for a complete presentation

Synopsis

Input

type Chunk = Vector Source #

A chunk of the input data

Compressed array

data CompressedArray e Source #

Compressed array

See also: compressChunks and decompressedArray.

Since: 0.1.0

Constructors

CompressedArray 

Fields

Instances

Instances details
(Show e, Unbox e) => Show (CompressedArray e) Source # 
Instance details

Defined in Shamochu

(Unbox e, Eq e) => Eq (CompressedArray e) Source # 
Instance details

Defined in Shamochu

makeChunks Source #

Arguments

:: (Unbox e, Ord e) 
=> Word

Chunk size

-> Vector e

Sequence to compress

-> Vector (Vector e) 
>>> makeChunks @Word 2 [1..9]
[[1,2],[3,4],[5,6],[7,8],[9]]

Since: 0.1.0

compressChunks :: forall e. (HasCallStack, Unbox e, Ord e) => Vector (Vector e) -> CompressedArray e Source #

Compress a sequence of Chunks

>>> compressChunks @Word [[1,2,3],[2,3,4],[3,1,2]]
CompressedArray {array = [3,1,2,3,4], offsets = [1,2,0], sizes = [3,3,3]}

Since: 0.1.0

decompressedArray :: (Unbox e, Ord e) => CompressedArray e -> Vector e Source #

Decompress a CompressedArray

\s (xs :: [Word]) -> let cs = makeChunks (1 + div s 4) (U.fromList xs) in decompressedArray (compressChunks cs) == V.foldMap' id cs

Since: 0.1.0

data CompressedBlob e Source #

Result of the two-stages compression

See also: compress and decompress.

Since: 0.1.0

Constructors

OneStage

Array compressed using one offsets array.

Fields

TwoStages

Array compressed using two offsets arrays.

Fields

Instances

Instances details
(Show e, Unbox e) => Show (CompressedBlob e) Source # 
Instance details

Defined in Shamochu

(Unbox e, Eq e) => Eq (CompressedBlob e) Source # 
Instance details

Defined in Shamochu

compress Source #

Arguments

:: forall e. (FiniteBits e, Unbox e, Ord e) 
=> NonEmpty Word

Chunk sizes to use for stage 1

-> [Word]

Chunk sizes to use for stage 2. If empty, stage 2 will not be run.

-> Vector e 
-> CompressedBlob e 

Compress a sequence in two stages

  1. Using 2 tables: data and offsets.
  2. Using 3 tables: data, offsets1 and offsets2.

Since: 0.1.0

decompress :: (Unbox e, Ord e) => CompressedBlob e -> Vector e Source #

Decompress a CompressedBlob.

\x (xs :: [Word]) -> let ys = U.fromList (take 300 (cycle (mconcat (L.permutations (x:xs))))) in decompress (compress [2,3,4] [1] ys) == ys

Since: 0.1.0

Stats

data Stats e Source #

Statistics about the compression

Since: 0.1.0

Instances

Instances details
Show e => Show (Stats e) Source # 
Instance details

Defined in Shamochu

Methods

showsPrec :: Int -> Stats e -> ShowS #

show :: Stats e -> String #

showList :: [Stats e] -> ShowS #

Eq e => Eq (Stats e) Source # 
Instance details

Defined in Shamochu

Methods

(==) :: Stats e -> Stats e -> Bool #

(/=) :: Stats e -> Stats e -> Bool #