Initial commit
This commit is contained in:
commit
4652462526
|
@ -0,0 +1,23 @@
|
||||||
|
name: test
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: erlef/setup-beam@v1
|
||||||
|
with:
|
||||||
|
otp-version: "26.0.2"
|
||||||
|
gleam-version: "1.2.0"
|
||||||
|
rebar3-version: "3"
|
||||||
|
# elixir-version: "1.15.4"
|
||||||
|
- run: gleam deps download
|
||||||
|
- run: gleam test
|
||||||
|
- run: gleam format --check src test
|
|
@ -0,0 +1,4 @@
|
||||||
|
*.beam
|
||||||
|
*.ez
|
||||||
|
/build
|
||||||
|
erl_crash.dump
|
|
@ -0,0 +1,28 @@
|
||||||
|
# gzlib
|
||||||
|
|
||||||
|
[![Package Version](https://img.shields.io/hexpm/v/gzlib)](https://hex.pm/packages/gzlib)
|
||||||
|
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/gzlib/)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gleam add gzlib
|
||||||
|
```
|
||||||
|
```gleam
|
||||||
|
import gzlib
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let data = <<1, 2, 3, 4, 5>>
|
||||||
|
let compressed_data = gzlib.compress(data)
|
||||||
|
let more_compressed_data = gzlib.compress_with_level(data, gzlib.max_compression)
|
||||||
|
let crc = gzlib.crc32(data)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Further documentation can be found at <https://hexdocs.pm/gzlib>.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gleam run # Run the project
|
||||||
|
gleam test # Run the tests
|
||||||
|
gleam shell # Run an Erlang shell
|
||||||
|
```
|
|
@ -0,0 +1,15 @@
|
||||||
|
name = "gzlib"
|
||||||
|
version = "1.0.0"
|
||||||
|
|
||||||
|
description = "zlib utilities for Gleam"
|
||||||
|
licences = ["AGPL-3.0-only"]
|
||||||
|
repository = { type = "github", user = "LilyRose2798", repo = "gzlib" }
|
||||||
|
links = [
|
||||||
|
{ title = "7Circles Git", href = "https://git.7cs.dev/lily/gzlib" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
gleam_stdlib = ">= 0.34.0 and < 2.0.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
gleeunit = ">= 1.0.0 and < 2.0.0"
|
|
@ -0,0 +1,11 @@
|
||||||
|
# This file was generated by Gleam
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
{ name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" },
|
||||||
|
{ name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[requirements]
|
||||||
|
gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" }
|
||||||
|
gleeunit = { version = ">= 1.0.0 and < 2.0.0" }
|
|
@ -0,0 +1,42 @@
|
||||||
|
pub opaque type CompressionLevel {
|
||||||
|
CompressionLevel(level: Int)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const no_compression = CompressionLevel(0)
|
||||||
|
|
||||||
|
pub const min_compression = CompressionLevel(1)
|
||||||
|
|
||||||
|
pub const max_compression = CompressionLevel(9)
|
||||||
|
|
||||||
|
pub const default_compression = CompressionLevel(6)
|
||||||
|
|
||||||
|
pub fn compression_level(level: Int) -> Result(CompressionLevel, Nil) {
|
||||||
|
case level >= 0 && level <= 9 {
|
||||||
|
True -> Ok(CompressionLevel(level))
|
||||||
|
False -> Error(Nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@external(erlang, "zlib", "compress")
|
||||||
|
@external(javascript, "./gzlib_js.mjs", "compress")
|
||||||
|
pub fn compress(data: BitArray) -> BitArray
|
||||||
|
|
||||||
|
@external(erlang, "gzlib_erl", "compress")
|
||||||
|
@external(javascript, "./gzlib_js.mjs", "compress")
|
||||||
|
fn do_compress_with_level(data: BitArray, level: Int) -> BitArray
|
||||||
|
|
||||||
|
pub fn compress_with_level(data: BitArray, level: CompressionLevel) -> BitArray {
|
||||||
|
do_compress_with_level(data, level.level)
|
||||||
|
}
|
||||||
|
|
||||||
|
@external(erlang, "zlib", "uncompress")
|
||||||
|
@external(javascript, "./gzlib_js.mjs", "uncompress")
|
||||||
|
pub fn uncompress(data: BitArray) -> BitArray
|
||||||
|
|
||||||
|
@external(erlang, "erlang", "crc32")
|
||||||
|
@external(javascript, "./gzlib_js.mjs", "crc32")
|
||||||
|
pub fn crc32(data: BitArray) -> Int
|
||||||
|
|
||||||
|
@external(erlang, "erlang", "crc32")
|
||||||
|
@external(javascript, "./gzlib_js.mjs", "continueCrc32")
|
||||||
|
pub fn continue_crc32(init: Int, data: BitArray) -> Int
|
|
@ -0,0 +1,12 @@
|
||||||
|
-module(gleam_zlib_erl).
|
||||||
|
|
||||||
|
-export([compress/2]).
|
||||||
|
|
||||||
|
compress(Data, Level) ->
|
||||||
|
Z = zlib:open(),
|
||||||
|
ok = zlib:deflateInit(Z, Level),
|
||||||
|
Compressed = zlib:deflate(Z, Data),
|
||||||
|
Last = zlib:deflate(Z, [], finish),
|
||||||
|
ok = zlib:deflateEnd(Z),
|
||||||
|
zlib:close(Z),
|
||||||
|
list_to_binary([Compressed|Last]).
|
|
@ -0,0 +1,12 @@
|
||||||
|
import { deflateSync, inflateSync } from "node:zlib"
|
||||||
|
import { BitArray } from "./gleam.mjs"
|
||||||
|
|
||||||
|
export const compress = (data, level = undefined) => new BitArray(new Uint8Array(deflateSync(data.buffer, { level })))
|
||||||
|
|
||||||
|
export const uncompress = data => new BitArray(new Uint8Array(inflateSync(data.buffer)))
|
||||||
|
|
||||||
|
const crcTable = [...Array(256)].map((_, i) => [...Array(8)].reduce(c => ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)), i))
|
||||||
|
|
||||||
|
export const crc32 = (data, init = 0) => (data.buffer.reduce((crc, x) => (crc >>> 8) ^ crcTable[(crc ^ x) & 0xFF], init ^ (-1)) ^ (-1)) >>> 0
|
||||||
|
|
||||||
|
export const continueCrc32 = (init, str) => crc32(str, init)
|
|
@ -0,0 +1,5 @@
|
||||||
|
import gleeunit
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
gleeunit.main()
|
||||||
|
}
|
Loading…
Reference in New Issue