git.iko.soy/rowtype-yoga/purescript-web-proletarian
on main help sign in
Initial commit
commit6bd3037299df68c6b5e836b5b00f349ca5e9cf0f authorMark Eibes <mark.eibes@gmail.com> dateThu 17 Nov 2022, 10:27 (4 years ago)
13 files changed+315
.gitignore+10 LICENSE+16 README.md+76 packages.dhall+105 spago.dhall+30 spago.test.dhall+21 src/Yoga/WebBoss.js+7 src/Yoga/WebBoss.purs+13 src/Yoga/WebProletarian/Types.purs+5 src/Yoga/WebWorker.js+10 src/Yoga/WebWorker.purs+11 test/Main.purs+11 web-proletarian.png
.gitignorenew file+10
@@ -0,0 +1,10 @@
1+/bower_components/
2+/node_modules/
3+/.pulp-cache/
4+/output/
5+/generated-docs/
6+/.psc-package/
7+/.psc*
8+/.purs*
9+/.psa*
10+/.spago
LICENSEnew file+16
@@ -0,0 +1,16 @@
1+MIT No Attribution
2+
3+Copyright 2021 Mark Eibes, Jan Schulte
4+
5+Permission is hereby granted, free of charge, to any person obtaining a copy of this
6+software and associated documentation files (the "Software"), to deal in the Software
7+without restriction, including without limitation the rights to use, copy, modify,
8+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
9+permit persons to whom the Software is furnished to do so.
10+
11+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
12+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
13+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
14+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
15+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
16+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
README.mdnew file+76
@@ -0,0 +1,76 @@
1+# ๐Ÿ Web Proletarian
2+
3+This library provides a way to define and interact with webworkers.
4+
5+This means you need to bundle your app with a bundler that understands the
6+`new Worker(new URL("someWorker.js", import.meta.url))` syntax (e.g. webpack5, vite, ...).
7+
8+Maybe it also works without bundling in some browsers with es modules, but I don't know.
9+
10+
11+## How To
12+
13+### Write the WebWorker in PureScript
14+To write a webworker you use the module `Yoga.WebProletarian.WebWorker`.
15+E.g.:
16+
17+```purs
18+module Worker.Echo where
19+
20+import Prelude
21+
22+import Effect (Effect)
23+import Yoga.WebProletarian.Types (Worker)
24+import Yoga.WebWorker (postMessageToBoss, subscribe)
25+
26+main โˆท Effect Unit
27+main = subscribe (\int -> postMessageToBoss (show int))
28+
29+-- webworker
30+foreign import newWorker โˆท Effect (Worker Int String)
31+```
32+
33+### Write a correspoding FFI file with the import
34+With an FFI file that your bundler understands:
35+```purs
36+export const newWorker = () => new Worker(new URL("../../workers/echo.worker.js", import.meta.url))
37+```
38+
39+Bundlers look for this kind of syntax at build time, so I couldn't find a way to
40+emit PureScript code that causes them to pick this up.
41+I guess the number of workers you'll have is limited anyway so I can personally live with the FFI.
42+
43+### Build your webworker
44+
45+This means you should have the bundled version of this worker in: `/workers/echo.worker.js`
46+
47+You can achieve this with spago by telling it to use your worker module as the Main method:
48+
49+```
50+spago bundle-app -m Worker.Echo --to /workers/echo.worker.js
51+```
52+
53+Then in your regular application you can interact with the Worker in the following way:
54+
55+### Interact with the webworker
56+
57+```purs
58+module Main where
59+
60+import Prelude
61+
62+import Effect (Effect)
63+import Yoga.WebProletarian.Types (Worker)
64+import Yoga.WebBoss (postMessageToWorker, onMessageFromWorker, terminate)
65+import Worker.Echo as Echo
66+
67+main :: Effect Unit
68+main = do
69+ worker โ† Echo.newWorker
70+ worker # onMessageFromWorker \msg -> do
71+ Console.log msg
72+ worker # terminate
73+ worker # postMessageToWorker 42
74+```
75+
76+### Bundle it up and have fun
packages.dhallnew file+105
@@ -0,0 +1,105 @@
1+{-
2+Welcome to your new Dhall package-set!
3+
4+Below are instructions for how to edit this file for most use
5+cases, so that you don't need to know Dhall to use it.
6+
7+## Use Cases
8+
9+Most will want to do one or both of these options:
10+1. Override/Patch a package's dependency
11+2. Add a package not already in the default package set
12+
13+This file will continue to work whether you use one or both options.
14+Instructions for each option are explained below.
15+
16+### Overriding/Patching a package
17+
18+Purpose:
19+- Change a package's dependency to a newer/older release than the
20+ default package set's release
21+- Use your own modified version of some dependency that may
22+ include new API, changed API, removed API by
23+ using your custom git repo of the library rather than
24+ the package set's repo
25+
26+Syntax:
27+where `entityName` is one of the following:
28+- dependencies
29+- repo
30+- version
31+-------------------------------
32+let upstream = --
33+in upstream
34+ with packageName.entityName = "new value"
35+-------------------------------
36+
37+Example:
38+-------------------------------
39+let upstream = --
40+in upstream
41+ with halogen.version = "master"
42+ with halogen.repo = "https://example.com/path/to/git/repo.git"
43+
44+ with halogen-vdom.version = "v4.0.0"
45+ with halogen-vdom.dependencies = [ "extra-dependency" ] # halogen-vdom.dependencies
46+-------------------------------
47+
48+### Additions
49+
50+Purpose:
51+- Add packages that aren't already included in the default package set
52+
53+Syntax:
54+where `<version>` is:
55+- a tag (i.e. "v4.0.0")
56+- a branch (i.e. "master")
57+- commit hash (i.e. "701f3e44aafb1a6459281714858fadf2c4c2a977")
58+-------------------------------
59+let upstream = --
60+in upstream
61+ with new-package-name =
62+ { dependencies =
63+ [ "dependency1"
64+ , "dependency2"
65+ ]
66+ , repo =
67+ "https://example.com/path/to/git/repo.git"
68+ , version =
69+ "<version>"
70+ }
71+-------------------------------
72+
73+Example:
74+-------------------------------
75+let upstream = --
76+in upstream
77+ with benchotron =
78+ { dependencies =
79+ [ "arrays"
80+ , "exists"
81+ , "profunctor"
82+ , "strings"
83+ , "quickcheck"
84+ , "lcg"
85+ , "transformers"
86+ , "foldable-traversable"
87+ , "exceptions"
88+ , "node-fs"
89+ , "node-buffer"
90+ , "node-readline"
91+ , "datetime"
92+ , "now"
93+ ]
94+ , repo =
95+ "https://github.com/hdgarrood/purescript-benchotron.git"
96+ , version =
97+ "v7.0.0"
98+ }
99+-------------------------------
100+-}
101+let upstream =
102+ https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20221115/packages.dhall
103+ sha256:cc53930f0ebfa5b1652f9e37eb7b1c424246ca78db3c7baf0b205e740e0e9e4e
104+
105+in upstream
spago.dhallnew file+30
@@ -0,0 +1,30 @@
1+{ name = "web-proletarian"
2+, license = "MIT"
3+, repository = "https://github.com/rowtype-yoga/purescript-web-proletarian"
4+, dependencies =
5+ [ "aff"
6+ , "avar"
7+ , "console"
8+ , "control"
9+ , "datetime"
10+ , "effect"
11+ , "either"
12+ , "exceptions"
13+ , "functions"
14+ , "maybe"
15+ , "newtype"
16+ , "parallel"
17+ , "prelude"
18+ , "record"
19+ , "record-studio"
20+ , "tailrec"
21+ , "transformers"
22+ , "tuples"
23+ , "typelevel-prelude"
24+ , "uncurried-transformers"
25+ , "unsafe-coerce"
26+ , "variant"
27+ ]
28+, packages = ./packages.dhall
29+, sources = [ "src/**/*.purs" ]
30+}
spago.test.dhallnew file+21
@@ -0,0 +1,21 @@
1+let conf = ./spago.dhall
2+
3+in conf // {
4+ sources = conf.sources # [ "test/**/*.purs" ],
5+ dependencies = conf.dependencies #
6+ [ "spec"
7+ , "spec-discovery"
8+ , "foreign-object"
9+ , "web-dom"
10+ , "arrays"
11+ , "strings"
12+ , "debug"
13+ , "tailrec"
14+ ,"datetime",
15+ "either",
16+ "foldable-traversable",
17+ "newtype",
18+ "transformers",
19+ "node-fs-aff"
20+ ]
21+}
src/Yoga/WebBoss.jsnew file+7
@@ -0,0 +1,7 @@
1+export const onMessageFromWorker = handler => worker => () => {
2+ worker.onmessage = (msg => handler(msg.data)())
3+}
4+
5+export const postMessageToWorker = msg => worker => () => worker.postMessage(msg)
6+
7+export const terminate = worker => () => worker.terminate()
src/Yoga/WebBoss.pursnew file+13
@@ -0,0 +1,13 @@
1+module Yoga.WebBoss where
2+
3+import Prelude
4+
5+import Effect (Effect)
6+import Yoga.WebProletarian.Types (Worker)
7+
8+foreign import onMessageFromWorker
9+ โˆท โˆ€ toBoss toWorker. (toBoss โ†’ Effect Unit) โ†’ Worker toBoss toWorker โ†’ Effect Unit
10+
11+foreign import postMessageToWorker โˆท โˆ€ toBoss toWorker. toWorker โ†’ Worker toBoss toWorker โ†’ Effect Unit
12+
13+foreign import terminate โˆท โˆ€ toBoss toWorker. Worker toBoss toWorker โ†’ Effect Unit
src/Yoga/WebProletarian/Types.pursnew file+5
@@ -0,0 +1,5 @@
1+module Yoga.WebProletarian.Types where
2+
3+foreign import data WorkerURL โˆท Type
4+foreign import data Worker โˆท Type โ†’ Type โ†’ Type
5+
src/Yoga/WebWorker.jsnew file+10
@@ -0,0 +1,10 @@
1+export const subscribe = handler => () => {
2+ addEventListener("message", (event) => {
3+ handler(event.data)();
4+ })
5+}
6+
7+export const quit = () => close()
8+
9+export const postMessageToBoss = data => () => postMessage(data)
10+
src/Yoga/WebWorker.pursnew file+11
@@ -0,0 +1,11 @@
1+module Yoga.WebWorker where
2+
3+import Prelude
4+import Effect (Effect)
5+
6+foreign import subscribe :: forall toWorker. (toWorker -> Effect Unit) -> Effect Unit
7+
8+foreign import quit :: Effect Unit
9+
10+foreign import postMessageToBoss :: forall toBoss. toBoss -> Effect Unit
11+
test/Main.pursnew file+11
@@ -0,0 +1,11 @@
1+module Test.Main where
2+
3+import Prelude
4+
5+import Effect (Effect)
6+import Effect.Class.Console (log)
7+
8+main :: Effect Unit
9+main = do
10+ log "๐Ÿ"
11+ log "You should add some tests."
web-proletarian.pngnew file

Binary file not shown.