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.nix
and update the project name and other relevant values (follow the comments). - Push your
flake.nix
file 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
README
with 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
huffman
orlzss
. - [COMPRESS/DECOMPRESS] specification whether we want to compress or decompress. Allowed values are
compress
ordecompress
. - [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.effekt
Open the REPL:
effekt
Build the project:
effekt --build src/main.effekt
This builds the project into the out/
directory, creating a runnable file out/main
.
To see all available options and backends, run:
effekt --help
While Nix installation is optional, it provides several benefits:
Update dependencies (also runs automatically in CI):
nix flake update
Open a shell with all necessary dependencies:
nix develop
Run the main entry point:
nix run
Build the project (output in result/bin/
):
nix build
effekt-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 bymain
andtest
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.nix
file, 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