This is a pretty simple Haskell application that runs entirely in the browser thanks to Web Assembly.
The idea was to try out how WASM Haskell backend would handle a package with non-trivial functionality but without complicated user interface. The pointfree package was great fit since it does interesting transformation while its interface is just a string from a user for input and a list of strings for output.
Apart from working conversion to pointfree in your browser this project might be interesting as a working example on how to use Haskell WASM backend.
These steps are made for Linux/MacOS but should work on Windows as well but may require some tweaking.
If in doubt you can check how this project’s CI is set up and copy steps from there: https://github.com/pointfree-wasm/pointfree-wasm.github.io/blob/master/.github/workflows/ci.yml. The advantage of CI is that it’s a working version.
Install ghc
and cabal
. A good way to do so is via (ghcup
)[https://www.haskell.org/ghcup/].
Please refer to https://gitlab.haskell.org/ghc/ghc-wasm-meta for detailed instructions.
For example, if you use nix
package manager then use following flake-based command:
$ nix shell https://gitlab.haskell.org/ghc/ghc-wasm-meta/-/archive/master/ghc-wasm-meta-master.tar.gz
Optionally do cabal update
, then execute cabal install happy
with regular ghc.
If you haven’t done so, add cabal’s installation directory to PATH:
$ export PATH="$HOME/.cabal/bin:$PATH"
Check with happy --version
that executable is available in the PATH environment variable:
$ happy --version
Happy Version 1.20.1.1 Copyright (c) 1993-1996 Andy Gill, Simon Marlow (c) 1997-2005 Simon Marlow
Happy is a Yacc for Haskell, and comes with ABSOLUTELY NO WARRANTY.
This program is free software; you can redistribute it and/or modify
it under the terms given in the file 'LICENSE' distributed with
the Happy sources.
NB this step is needed because haskell-src-exts
depends on the happy
build tool but haskell-src-exts
wasn’t updated to let cabal
quietly provide happy
during build so happy
executable has to be on the PATH for the time being.
it
After wasm32-wasi-cabal build all
the resulting .wasm
file will be at the path returned by wasm32-wasi-cabal list-bin pointfree-wasm:exe:pointfree-wasm
. Link it to the directory where index.html
is located, i.e. the project’s root:
$ ln -s $(wasm32-wasi-cabal list-bin pointfree-wasm:exe:pointfree-wasm) .
Next generate pointfree-wasm.js
that provides some definitions the .wasm
file requires:
$ $(wasm32-wasi-ghc --print-libdir)/post-link.mjs -i $(wasm32-wasi-cabal list-bin pointfree-wasm:exe:pointfree-wasm) -o pointfree-wasm.js
Any web server would do, good starting point is python3 -m http.server
if Python is installed.
Now you can open the address the web server is running on in the browser and it should work.