This project is part of the Effective Programming with Effects course at the University of Tübingen.
This project implements Huffman coding and LZ77 compression algorithm on byte streams. It implements the LZSS version of LZ77. It is written in the effekt language, a research language developed at the University of Tübingen.
After using this template, follow these steps to set up your project:
-
Set up your development environment:
- Clone this repository locally.
- Open it in VSCode.
- Install the Effekt VSCode extension offered in the pop-up in the bottom right.
-
Customize the project:
- Open
flake.nixand update the project name and other relevant values (follow the comments). - Push your
flake.nixfile after the changes and see if the CI agrees.
- Open
-
Set-up auto-update CI:
- Go to Settings -> Actions -> General and check "Allow GitHub Actions to create and approve pull requests" in order to get weekly Pull Requests on Tuesday that update the Effekt version in CI.
- See the CI section for more details
-
Replace this
READMEwith your own!- Please link back to this repo if you can :)
Run the main file:
effekt src/compress.effekt [SOURCE_FILENAME] [METHOD] [COMPRESS/DECOMPRESS] [OUTPUT_FILENAME]Where:
- [SOURCE_FILENAME] is the path to the file we want to compress
- [METHOD] the compression method we want to use. Allowed values are
huffmanorlzss. - [COMPRESS/DECOMPRESS] specification whether we want to compress or decompress. Allowed values are
compressordecompress. - [OUTPUT_FILENAME] path to the newly created file
Example usage:
effekt.sh src/compress.effekt --backend js --includes . -- README.md huffman compress test.bin! This assumes we are currently in the project directory, otherwise absolute paths are needed !
Run the tests:
effekt src/test.effektOpen the REPL:
effektBuild the project:
effekt --build src/main.effektThis builds the project into the out/ directory, creating a runnable file out/main.
To see all available options and backends, run:
effekt --helpWhile Nix installation is optional, it provides several benefits:
Update dependencies (also runs automatically in CI):
nix flake updateOpen a shell with all necessary dependencies:
nix developRun the main entry point:
nix runBuild the project (output in result/bin/):
nix buildeffekt-stm- This very project!
.github/workflows/*.yml: Contains the CI definitionssrc/: Contains the source codemain.effekt: Main entry pointtest.effekt: Entry point for testslib.effekt: Library code imported bymainandtest
flake.nix: Package configuration in a Nix flakeflake.lock: Auto-generated lockfile for dependenciesLICENSE: Project licenseREADME: This README file
Two GitHub Actions are set up:
-
flake-check:- Checks the
flake.nixfile, builds and tests the project - Runs on demand, on
main, and on PRs - To run custom commands, add a step using:
nix run -- <ARGS>to run the main entry point with the given argumentsnix develop -c '<bash command to run>'to run commands in the correct environment
- Checks the
-
update-flake-lock:- Updates package versions in
flake.nix - Runs on demand and weekly (Tuesdays at 00:00 UTC)
- Updates package versions in