From d90ea908cca234b6cd7e95ffa4b268bc58c6be23 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Tue, 10 Jan 2023 19:59:04 -0600 Subject: [PATCH 01/11] Update FFI to EffectFnX types --- src/Web/Worker/DedicatedWorkerGlobalScope.js | 28 +++------- .../Worker/DedicatedWorkerGlobalScope.purs | 29 ++++++---- src/Web/Worker/GlobalScope.js | 56 +++++-------------- src/Web/Worker/GlobalScope.purs | 45 +++++++++++---- src/Web/Worker/Location.js | 56 +++++++------------ src/Web/Worker/Location.purs | 46 ++++++++++++--- src/Web/Worker/MessageEvent.js | 10 +--- src/Web/Worker/MessageEvent.purs | 10 ++-- src/Web/Worker/MessagePort.js | 42 ++++---------- src/Web/Worker/MessagePort.purs | 33 ++++++++--- src/Web/Worker/Navigator.js | 32 ++++------- src/Web/Worker/Navigator.purs | 30 +++++++--- src/Web/Worker/Options.purs | 29 ++++++---- src/Web/Worker/SharedWorker.js | 26 +++------ src/Web/Worker/SharedWorker.purs | 22 +++++--- src/Web/Worker/SharedWorkerGlobalScope.js | 12 ++-- src/Web/Worker/SharedWorkerGlobalScope.purs | 14 +++-- src/Web/Worker/Types.purs | 2 +- src/Web/Worker/Worker.js | 54 ++++-------------- src/Web/Worker/Worker.purs | 38 ++++++++----- 20 files changed, 291 insertions(+), 323 deletions(-) diff --git a/src/Web/Worker/DedicatedWorkerGlobalScope.js b/src/Web/Worker/DedicatedWorkerGlobalScope.js index 889d196..b786b8a 100644 --- a/src/Web/Worker/DedicatedWorkerGlobalScope.js +++ b/src/Web/Worker/DedicatedWorkerGlobalScope.js @@ -1,33 +1,21 @@ /* @globals self */ -export function name () { +export function name() { return self.name; } -export function postMessageImpl(data) { - return function(tr) { - return function () { - self.postMessage(data, tr.length > 0 ? tr : undefined); - }; - }; +export function postMessageImpl(data, tr) { + self.postMessage(data, tr.length > 0 ? tr : undefined); } export function close() { self.close(); } -export function onMessage(f) { - return function () { - self.onmessage = function (ev) { - f(ev)(); - }; - }; +export function onMessageImpl(f) { + self.onmessage = f; } -export function onMessageError(f) { - return function () { - self.onmessageerror = function (ev) { - f(ev)(); - }; - }; -} \ No newline at end of file +export function onMessageErrorImpl(f) { + self.onmessageerror = f; +} diff --git a/src/Web/Worker/DedicatedWorkerGlobalScope.purs b/src/Web/Worker/DedicatedWorkerGlobalScope.purs index 0339ddd..b9249a5 100644 --- a/src/Web/Worker/DedicatedWorkerGlobalScope.purs +++ b/src/Web/Worker/DedicatedWorkerGlobalScope.purs @@ -6,33 +6,38 @@ module Web.Worker.DedicatedWorkerGlobalScope , postMessage , postMessage' , module GlobalScope - ) - where + ) where import Prelude + import Effect (Effect) -import Web.Worker.Types (Transferable) +import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, runEffectFn1, runEffectFn2) +import Web.Worker.GlobalScope (importScripts, location, navigator, onError, onLanguageChange, onOffline, onOnline, onRejectionHandled, onUnhandledRejection) as GlobalScope import Web.Worker.MessageEvent (MessageEvent) -import Web.Worker.GlobalScope (importScripts, location, navigator, onError, onLanguageChange, onOffline - , onOnline, onRejectionHandled, onUnhandledRejection - ) as GlobalScope +import Web.Worker.Types (Transferable) foreign import name :: Effect String -foreign import postMessageImpl :: forall msg. msg -> Array Transferable -> Effect Unit - -- | sends a message to the main thread that spawned it. postMessage :: forall msg. msg -> Effect Unit -postMessage msg = postMessageImpl msg [] +postMessage msg = postMessage' msg [] postMessage' :: forall msg. msg -> Array Transferable -> Effect Unit -postMessage' = postMessageImpl +postMessage' msg tr = runEffectFn2 postMessageImpl msg tr + +foreign import postMessageImpl :: forall msg. EffectFn2 msg (Array Transferable) Unit -- | upon calling close, any queued tasks present in the event loop are discarded and the web worker scope is closed. foreign import close :: Effect Unit -- | fired when the worker receives a message from its parent. -foreign import onMessage :: (MessageEvent -> Effect Unit) -> Effect Unit +onMessage :: (MessageEvent -> Effect Unit) -> Effect Unit +onMessage cb = runEffectFn1 onMessageImpl (mkEffectFn1 cb) + +foreign import onMessageImpl :: EffectFn1 (EffectFn1 MessageEvent Unit) Unit -- | fired when a worker receives a message that can't be deserialized. -foreign import onMessageError :: (MessageEvent -> Effect Unit) -> Effect Unit \ No newline at end of file +onMessageError :: (MessageEvent -> Effect Unit) -> Effect Unit +onMessageError cb = runEffectFn1 onMessageErrorImpl (mkEffectFn1 cb) + +foreign import onMessageErrorImpl :: EffectFn1 (EffectFn1 MessageEvent Unit) Unit diff --git a/src/Web/Worker/GlobalScope.js b/src/Web/Worker/GlobalScope.js index 83ff3dd..68338f9 100644 --- a/src/Web/Worker/GlobalScope.js +++ b/src/Web/Worker/GlobalScope.js @@ -1,9 +1,7 @@ /* @globals self */ -export function importScripts (urls) { - return function () { - self.importScripts(...urls); - } +export function importScriptsImpl(urls) { + self.importScripts(...urls); } export function location() { @@ -14,50 +12,26 @@ export function navigator() { return self.navigator; } -export function onError(f) { - return function () { - self.onerror = function (ev) { - f(ev)(); - }; - }; +export function onErrorImpl(f) { + self.onerror = f; } -export function onLanguageChange(f) { - return function () { - self.onlanguagechange = function (ev) { - f(ev)(); - }; - }; +export function onLanguageChangeImpl(f) { + self.onlanguagechange = f; } -export function onOffline(f) { - return function () { - self.onoffline = function (ev) { - f(ev)(); - }; - }; +export function onOfflineImpl(f) { + self.onoffline = f; } -export function onOnline(f) { - return function () { - self.ononline = function (ev) { - f(ev)(); - }; - }; +export function onOnlineImpl(f) { + self.ononline = f; } -export function onRejectionHandled(f) { - return function () { - self.onrejectionhandled = function (ev) { - f(ev)(); - }; - }; +export function onRejectionHandledImpl(f) { + self.onrejectionhandled = f; } -export function onUnhandledRejection(f) { - return function () { - self.onunhandledrejection = function (ev) { - f(ev)(); - }; - }; -} \ No newline at end of file +export function onUnhandledRejectionImpl(f) { + self.onunhandledrejection = f; +} diff --git a/src/Web/Worker/GlobalScope.purs b/src/Web/Worker/GlobalScope.purs index d62630d..932f11c 100644 --- a/src/Web/Worker/GlobalScope.purs +++ b/src/Web/Worker/GlobalScope.purs @@ -1,5 +1,4 @@ -- | This module contains functions that can be called by any worker thread. - module Web.Worker.GlobalScope ( importScripts , location @@ -10,30 +9,52 @@ module Web.Worker.GlobalScope , onOnline , onRejectionHandled , onUnhandledRejection - ) - where + ) where import Prelude + import Effect (Effect) -import Web.Worker.Navigator (Navigator) -import Web.Worker.Location (Location) +import Effect.Uncurried (EffectFn1, mkEffectFn1, runEffectFn1) import Web.Event.Event (Event) +import Web.Worker.Location (Location) +import Web.Worker.Navigator (Navigator) + +importScripts :: Array String -> Effect Unit +importScripts arr = runEffectFn1 importScriptsImpl arr -foreign import importScripts :: Array String -> Effect Unit +foreign import importScriptsImpl :: EffectFn1 (Array String) Unit foreign import location :: Effect Location foreign import navigator :: Effect Navigator -- | fired when an error occurs in the worker -foreign import onError :: (Event -> Effect Unit) -> Effect Unit +onError :: (Event -> Effect Unit) -> Effect Unit +onError cb = runEffectFn1 onErrorImpl (mkEffectFn1 cb) + +foreign import onErrorImpl :: EffectFn1 (EffectFn1 Event Unit) Unit + +onLanguageChange :: (Event -> Effect Unit) -> Effect Unit +onLanguageChange cb = runEffectFn1 onLanguageChangeImpl (mkEffectFn1 cb) + +foreign import onLanguageChangeImpl :: EffectFn1 (EffectFn1 Event Unit) Unit + +onOffline :: (Event -> Effect Unit) -> Effect Unit +onOffline cb = runEffectFn1 onOfflineImpl (mkEffectFn1 cb) + +foreign import onOfflineImpl :: EffectFn1 (EffectFn1 Event Unit) Unit + +onOnline :: (Event -> Effect Unit) -> Effect Unit +onOnline cb = runEffectFn1 onOnlineImpl (mkEffectFn1 cb) -foreign import onLanguageChange :: (Event -> Effect Unit) -> Effect Unit +foreign import onOnlineImpl :: EffectFn1 (EffectFn1 Event Unit) Unit -foreign import onOffline :: (Event -> Effect Unit) -> Effect Unit +onRejectionHandled :: (Event -> Effect Unit) -> Effect Unit +onRejectionHandled cb = runEffectFn1 onRejectionHandledImpl (mkEffectFn1 cb) -foreign import onOnline :: (Event -> Effect Unit) -> Effect Unit +foreign import onRejectionHandledImpl :: EffectFn1 (EffectFn1 Event Unit) Unit -foreign import onRejectionHandled :: (Event -> Effect Unit) -> Effect Unit +onUnhandledRejection :: (Event -> Effect Unit) -> Effect Unit +onUnhandledRejection cb = runEffectFn1 onUnhandledRejectionImpl (mkEffectFn1 cb) -foreign import onUnhandledRejection :: (Event -> Effect Unit) -> Effect Unit \ No newline at end of file +foreign import onUnhandledRejectionImpl :: EffectFn1 (EffectFn1 Event Unit) Unit diff --git a/src/Web/Worker/Location.js b/src/Web/Worker/Location.js index 08829e8..3688ec6 100644 --- a/src/Web/Worker/Location.js +++ b/src/Web/Worker/Location.js @@ -1,53 +1,35 @@ -export function hash(location) { - return function () { - return location.hash; - }; +export function hashImpl(location) { + return location.hash; } -export function host(location) { - return function () { - return location.host; - }; +export function hostImpl(location) { + return location.host; } -export function hostname(location) { - return function () { - return location.hostname; - }; +export function hostnameImpl(location) { + return location.hostname; } -export function href(location) { - return function () { - return location.href; - }; +export function hrefImpl(location) { + return location.href; } -export function origin(location) { - return function () { - return location.origin; - }; +export function originImpl(location) { + return location.origin; } -export function pathname(location) { - return function () { - return location.pathname; - }; +export function pathnameImpl(location) { + return location.pathname; } -export function port(location) { - return function () { - return location.port; - }; +export function portImpl(location) { + return location.port; } -export function protocol(location) { - return function () { - return location.protocol; - }; +export function protocolImpl(location) { + return location.protocol; } -export function search(location) { - return function () { - return location.search; - }; -} \ No newline at end of file +export function searchImpl(location) { + return location.search; +} diff --git a/src/Web/Worker/Location.purs b/src/Web/Worker/Location.purs index 2ae534f..74c369f 100644 --- a/src/Web/Worker/Location.purs +++ b/src/Web/Worker/Location.purs @@ -13,23 +13,51 @@ module Web.Worker.Location ) where import Effect (Effect) +import Effect.Uncurried (EffectFn1, runEffectFn1) foreign import data Location :: Type -foreign import hash :: Location -> Effect String +hash :: Location -> Effect String +hash loc = runEffectFn1 hashImpl loc -foreign import host :: Location -> Effect String +foreign import hashImpl :: EffectFn1 Location String -foreign import hostname :: Location -> Effect String +host :: Location -> Effect String +host loc = runEffectFn1 hostImpl loc -foreign import href :: Location -> Effect String +foreign import hostImpl :: EffectFn1 Location String -foreign import origin :: Location -> Effect String +hostname :: Location -> Effect String +hostname loc = runEffectFn1 hostnameImpl loc -foreign import pathname :: Location -> Effect String +foreign import hostnameImpl :: EffectFn1 Location String -foreign import port :: Location -> Effect String +href :: Location -> Effect String +href loc = runEffectFn1 hrefImpl loc -foreign import protocol :: Location -> Effect String +foreign import hrefImpl :: EffectFn1 Location String -foreign import search :: Location -> Effect String +origin :: Location -> Effect String +origin loc = runEffectFn1 originImpl loc + +foreign import originImpl :: EffectFn1 Location String + +pathname :: Location -> Effect String +pathname loc = runEffectFn1 pathnameImpl loc + +foreign import pathnameImpl :: EffectFn1 Location String + +port :: Location -> Effect String +port loc = runEffectFn1 portImpl loc + +foreign import portImpl :: EffectFn1 Location String + +protocol :: Location -> Effect String +protocol loc = runEffectFn1 protocolImpl loc + +foreign import protocolImpl :: EffectFn1 Location String + +search :: Location -> Effect String +search loc = runEffectFn1 searchImpl loc + +foreign import searchImpl :: EffectFn1 Location String diff --git a/src/Web/Worker/MessageEvent.js b/src/Web/Worker/MessageEvent.js index eeaf251..b4f65e1 100644 --- a/src/Web/Worker/MessageEvent.js +++ b/src/Web/Worker/MessageEvent.js @@ -14,10 +14,6 @@ export function ports(ev) { return ev.ports; } -export function sourceImpl(just) { - return function (nothing) { - return function (ev) { - return ev.source == null ? nothing : just(ev.source); - } - } -} \ No newline at end of file +export function sourceImpl(just, nothing, ev) { + return ev.source == null ? nothing : just(ev.source); +} diff --git a/src/Web/Worker/MessageEvent.purs b/src/Web/Worker/MessageEvent.purs index 8e27eef..4bf301d 100644 --- a/src/Web/Worker/MessageEvent.purs +++ b/src/Web/Worker/MessageEvent.purs @@ -7,16 +7,16 @@ module Web.Worker.MessageEvent , ports , source , module Types - ) - where + ) where +import Data.Function.Uncurried (Fn3, runFn3) import Data.Maybe (Maybe(..)) import Foreign (Foreign) +import Unsafe.Coerce (unsafeCoerce) import Web.Event.Event (Event) import Web.Internal.FFI (unsafeReadProtoTagged) import Web.Worker.Types (MessageEvent) as Types import Web.Worker.Types (MessageEvent, MessagePort) -import Unsafe.Coerce (unsafeCoerce) fromEvent :: Event -> Maybe MessageEvent fromEvent = unsafeReadProtoTagged "MessageEvent" @@ -32,7 +32,7 @@ foreign import lastEventId :: MessageEvent -> String foreign import ports :: MessageEvent -> Array MessagePort -foreign import sourceImpl :: forall a. (a -> Maybe a) -> Maybe a -> MessageEvent -> Maybe MessagePort +foreign import sourceImpl :: Fn3 (forall a. a -> Maybe a) (forall a. Maybe a) MessageEvent (Maybe MessagePort) source :: MessageEvent -> Maybe MessagePort -source = sourceImpl Just Nothing \ No newline at end of file +source msg = runFn3 sourceImpl Just Nothing msg diff --git a/src/Web/Worker/MessagePort.js b/src/Web/Worker/MessagePort.js index 5091c8e..08baa2f 100644 --- a/src/Web/Worker/MessagePort.js +++ b/src/Web/Worker/MessagePort.js @@ -1,41 +1,19 @@ -export function close(port) { - return function () { - port.close(); - }; +export function closeImpl(port) { + port.close(); } -export function start(port) { - return function () { - port.start(); - }; +export function startImpl(port) { + port.start(); } -export function onMessage(f) { - return function (port) { - return function () { - port.onmessage = function (ev) { - f(ev)(); - }; - }; - }; +export function onMessageImpl(port, f) { + port.onmessage = f; } -export function onMessageError(f) { - return function (port) { - return function () { - port.onmessageerror = function (ev) { - f(ev)(); - }; - }; - }; +export function onMessageErrorImpl(port, f) { + port.onmessageerror = f; } -export function postMessageImpl(data) { - return function (transfer) { - return function (port) { - return function () { - port.postMessage(data, transfer.length > 0 ? transfer : undefined); - }; - }; - }; +export function postMessageImpl(port, data, transfer) { + port.postMessage(data, transfer.length > 0 ? transfer : undefined); } diff --git a/src/Web/Worker/MessagePort.purs b/src/Web/Worker/MessagePort.purs index 22228fc..e4a937f 100644 --- a/src/Web/Worker/MessagePort.purs +++ b/src/Web/Worker/MessagePort.purs @@ -6,24 +6,39 @@ module Web.Worker.MessagePort , postMessage' , start , close - ) - where + ) where import Prelude + import Effect (Effect) +import Effect.Uncurried (EffectFn1, EffectFn2, EffectFn3, mkEffectFn1, runEffectFn1, runEffectFn2, runEffectFn3) import Web.Worker.Types (MessageEvent, MessagePort, Transferable) import Web.Worker.Types (MessagePort) as Types -foreign import onMessage :: (MessageEvent -> Effect Unit) -> MessagePort -> Effect Unit -foreign import onMessageError :: (MessageEvent -> Effect Unit) -> MessagePort -> Effect Unit +onMessage :: (MessageEvent -> Effect Unit) -> MessagePort -> Effect Unit +onMessage cb port = runEffectFn2 onMessageImpl port (mkEffectFn1 cb) + +foreign import onMessageImpl :: EffectFn2 MessagePort (EffectFn1 MessageEvent Unit) Unit + +onMessageError :: (MessageEvent -> Effect Unit) -> MessagePort -> Effect Unit +onMessageError cb port = runEffectFn2 onMessageErrorImpl port (mkEffectFn1 cb) + +foreign import onMessageErrorImpl :: EffectFn2 MessagePort (EffectFn1 MessageEvent Unit) Unit -foreign import postMessageImpl :: forall msg. msg -> Array Transferable -> MessagePort -> Effect Unit +foreign import postMessageImpl :: forall msg. EffectFn3 MessagePort msg (Array Transferable) Unit postMessage :: forall msg. msg -> MessagePort -> Effect Unit -postMessage msg = postMessageImpl msg [] +postMessage msg port = postMessage' msg [] port postMessage' :: forall msg. msg -> Array Transferable -> MessagePort -> Effect Unit -postMessage' = postMessageImpl +postMessage' msg data_ port = runEffectFn3 postMessageImpl port msg data_ + +close :: MessagePort -> Effect Unit +close port = runEffectFn1 closeImpl port + +foreign import closeImpl :: EffectFn1 MessagePort Unit + +start :: MessagePort -> Effect Unit +start port = runEffectFn1 startImpl port -foreign import close :: MessagePort -> Effect Unit -foreign import start :: MessagePort -> Effect Unit +foreign import startImpl :: EffectFn1 MessagePort Unit diff --git a/src/Web/Worker/Navigator.js b/src/Web/Worker/Navigator.js index 4fd7b60..247f0f4 100644 --- a/src/Web/Worker/Navigator.js +++ b/src/Web/Worker/Navigator.js @@ -1,29 +1,19 @@ -export function language(navigator) { - return function () { - return navigator.language; - }; +export function languageImpl(navigator) { + return navigator.language; } -export function languages(navigator) { - return function () { - return navigator.languages; - }; +export function languagesImpl(navigator) { + return navigator.languages; } -export function hardwareConcurrency(navigator) { - return function () { - return navigator.hardwareConcurrency; - }; +export function hardwareConcurrencyImpl(navigator) { + return navigator.hardwareConcurrency; } -export function onLine(navigator) { - return function () { - return navigator.onLine; - }; +export function onLineImpl(navigator) { + return navigator.onLine; } -export function userAgent(navigator) { - return function () { - return navigator.userAgent; - }; -} \ No newline at end of file +export function userAgentImpl(navigator) { + return navigator.userAgent; +} diff --git a/src/Web/Worker/Navigator.purs b/src/Web/Worker/Navigator.purs index 4407b37..70996a8 100644 --- a/src/Web/Worker/Navigator.purs +++ b/src/Web/Worker/Navigator.purs @@ -7,22 +7,36 @@ module Web.Worker.Navigator , languages , onLine , userAgent - ) - where + ) where import Effect (Effect) +import Effect.Uncurried (EffectFn1, runEffectFn1) foreign import data Navigator :: Type -foreign import language :: Navigator -> Effect String +language :: Navigator -> Effect String +language nav = runEffectFn1 languageImpl nav -foreign import languages :: Navigator -> Effect (Array String) +foreign import languageImpl :: EffectFn1 Navigator String -foreign import hardwareConcurrency :: Navigator -> Effect Int +languages :: Navigator -> Effect (Array String) +languages nav = runEffectFn1 languagesImpl nav -foreign import onLine :: Navigator -> Effect Boolean +foreign import languagesImpl :: EffectFn1 Navigator (Array String) -foreign import userAgent :: Navigator -> Effect String +hardwareConcurrency :: Navigator -> Effect Int +hardwareConcurrency nav = runEffectFn1 hardwareConcurrencyImpl nav +foreign import hardwareConcurrencyImpl :: EffectFn1 Navigator Int --- todo: complete the list of attributes \ No newline at end of file +onLine :: Navigator -> Effect Boolean +onLine nav = runEffectFn1 onLineImpl nav + +foreign import onLineImpl :: EffectFn1 Navigator Boolean + +userAgent :: Navigator -> Effect String +userAgent nav = runEffectFn1 userAgentImpl nav + +foreign import userAgentImpl :: EffectFn1 Navigator String + +-- todo: complete the list of attributes diff --git a/src/Web/Worker/Options.purs b/src/Web/Worker/Options.purs index 653c67b..68f3992 100644 --- a/src/Web/Worker/Options.purs +++ b/src/Web/Worker/Options.purs @@ -4,8 +4,7 @@ module Web.Worker.Options , WorkerType(..) , defaultWorkerOptions , toJsOptions - ) - where + ) where import Prelude @@ -18,10 +17,10 @@ data Credentials | SameOrigin | Include -type WorkerOptions - = { name :: String - , type :: WorkerType - } +type WorkerOptions = + { name :: String + , type :: WorkerType + } defaultWorkerOptions :: WorkerOptions defaultWorkerOptions = @@ -29,15 +28,21 @@ defaultWorkerOptions = , type: Classic } +printCredentials :: Credentials -> String +printCredentials = case _ of + Omit -> "omit" + SameOrigin -> "same-origin" + Include -> "include" + instance Show Credentials where show = case _ of - Omit -> "omit" - SameOrigin -> "same-origin" - Include -> "include" + Omit -> "Omit" + SameOrigin -> "SameOrigin" + Include -> "Include" toJsOptions :: WorkerOptions -> { name :: String, credentials :: String, type :: String } toJsOptions { name, type: t } = case t of - Classic -> + Classic -> { name , type: "classic" , credentials: "same-origin" @@ -45,5 +50,5 @@ toJsOptions { name, type: t } = case t of Module credentials -> { name , type: "module" - , credentials: show credentials - } \ No newline at end of file + , credentials: printCredentials credentials + } diff --git a/src/Web/Worker/SharedWorker.js b/src/Web/Worker/SharedWorker.js index 2cf90d3..1b3183b 100644 --- a/src/Web/Worker/SharedWorker.js +++ b/src/Web/Worker/SharedWorker.js @@ -1,23 +1,11 @@ -export function _new (src) { - return function (opts) { - return function () { - return new SharedWorker(src, opts); - }; - }; +export function newImpl(src, opts) { + return new SharedWorker(src, opts); } -export function port (worker) { - return function () { - return worker.port; - } +export function portImpl(worker) { + return worker.port; } -export function onError(f) { - return function (worker) { - return function () { - worker.onerror = function (ev) { - f(ev)(); - }; - }; - }; -} \ No newline at end of file +export function onErrorImpl(worker, f) { + worker.onerror = f; +} diff --git a/src/Web/Worker/SharedWorker.purs b/src/Web/Worker/SharedWorker.purs index efffa32..9b9a5f8 100644 --- a/src/Web/Worker/SharedWorker.purs +++ b/src/Web/Worker/SharedWorker.purs @@ -6,30 +6,28 @@ module Web.Worker.SharedWorker , port , toEventTarget , module Options - ) - where + ) where import Prelude import Data.Maybe (Maybe) import Effect (Effect) +import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, runEffectFn1, runEffectFn2) import Unsafe.Coerce (unsafeCoerce) import Web.Event.Event (Event) import Web.Event.EventTarget (EventTarget) import Web.Internal.FFI (unsafeReadProtoTagged) -import Web.Worker.Options (WorkerOptions, Credentials(..), - WorkerType(..), defaultWorkerOptions - ) as Options +import Web.Worker.Options (WorkerOptions, Credentials(..), WorkerType(..), defaultWorkerOptions) as Options import Web.Worker.Options (WorkerOptions, toJsOptions) import Web.Worker.Types (MessagePort) foreign import data SharedWorker :: Type -foreign import _new :: String -> { name :: String, credentials :: String, type :: String } -> Effect SharedWorker +foreign import newImpl :: EffectFn2 String { name :: String, credentials :: String, type :: String } SharedWorker -- | creates a worker object that executes the script at the specified URL. new :: String -> WorkerOptions -> Effect SharedWorker -new url options = _new url (toJsOptions options) +new url options = runEffectFn2 newImpl url (toJsOptions options) fromEventTarget :: EventTarget -> Maybe SharedWorker fromEventTarget = unsafeReadProtoTagged "SharedWorker" @@ -37,7 +35,13 @@ fromEventTarget = unsafeReadProtoTagged "SharedWorker" toEventTarget :: SharedWorker -> EventTarget toEventTarget = unsafeCoerce -foreign import port :: SharedWorker -> Effect MessagePort +port :: SharedWorker -> Effect MessagePort +port worker = runEffectFn1 portImpl worker + +foreign import portImpl :: EffectFn1 SharedWorker MessagePort -- | fired when an error occurs in the worker. -foreign import onError :: (Event -> Effect Unit) -> SharedWorker -> Effect Unit +onError :: (Event -> Effect Unit) -> SharedWorker -> Effect Unit +onError cb worker = runEffectFn2 onErrorImpl worker (mkEffectFn1 cb) + +foreign import onErrorImpl :: EffectFn2 SharedWorker (EffectFn1 Event Unit) Unit diff --git a/src/Web/Worker/SharedWorkerGlobalScope.js b/src/Web/Worker/SharedWorkerGlobalScope.js index d77ef09..55863c0 100644 --- a/src/Web/Worker/SharedWorkerGlobalScope.js +++ b/src/Web/Worker/SharedWorkerGlobalScope.js @@ -1,6 +1,6 @@ /* @globals self */ -export function name () { +export function name() { return self.name; } @@ -8,10 +8,6 @@ export function close() { self.close(); } -export function onConnect(f) { - return function () { - self.onconnect = function (ev) { - f(ev)(); - }; - }; -} \ No newline at end of file +export function onConnectImpl(f) { + self.onconnect = f; +} diff --git a/src/Web/Worker/SharedWorkerGlobalScope.purs b/src/Web/Worker/SharedWorkerGlobalScope.purs index 1aae95d..ccf2812 100644 --- a/src/Web/Worker/SharedWorkerGlobalScope.purs +++ b/src/Web/Worker/SharedWorkerGlobalScope.purs @@ -3,19 +3,21 @@ module Web.Worker.SharedWorkerGlobalScope , name , onConnect , module GlobalScope - ) - where + ) where import Prelude + import Effect (Effect) +import Effect.Uncurried (EffectFn1, mkEffectFn1, runEffectFn1) import Web.Event.Event (Event) -import Web.Worker.GlobalScope (importScripts, location, navigator, onError, onLanguageChange, onOffline - , onOnline, onRejectionHandled, onUnhandledRejection - ) as GlobalScope +import Web.Worker.GlobalScope (importScripts, location, navigator, onError, onLanguageChange, onOffline, onOnline, onRejectionHandled, onUnhandledRejection) as GlobalScope foreign import name :: Effect String -- | upon calling close, any queued tasks present in the event loop are discarded and the web worker scope is closed. foreign import close :: Effect Unit -foreign import onConnect :: (Event -> Effect Unit) -> Effect Unit \ No newline at end of file +onConnect :: (Event -> Effect Unit) -> Effect Unit +onConnect cb = runEffectFn1 onConnectImpl (mkEffectFn1 cb) + +foreign import onConnectImpl :: EffectFn1 (EffectFn1 Event Unit) Unit diff --git a/src/Web/Worker/Types.purs b/src/Web/Worker/Types.purs index 7a17e47..ab788fb 100644 --- a/src/Web/Worker/Types.purs +++ b/src/Web/Worker/Types.purs @@ -2,4 +2,4 @@ module Web.Worker.Types where foreign import data Transferable :: Type foreign import data MessagePort :: Type -foreign import data MessageEvent :: Type \ No newline at end of file +foreign import data MessageEvent :: Type diff --git a/src/Web/Worker/Worker.js b/src/Web/Worker/Worker.js index 22d21bb..0391c2e 100644 --- a/src/Web/Worker/Worker.js +++ b/src/Web/Worker/Worker.js @@ -1,53 +1,23 @@ -export function _new (src) { - return function (opts) { - return function () { - return new Worker(src, opts); - }; - }; +export function newImpl(src, opts) { + return new Worker(src, opts); } -export function postMessageImpl(data) { - return function (transfer) { - return function (worker) { - return function () { - worker.postMessage(data, transfer.length > 0 ? transfer : undefined); - }; - }; - }; +export function postMessageImpl(worker, data, transfer) { + worker.postMessage(data, transfer.length > 0 ? transfer : undefined); } -export function terminate (worker) { - return function () { - worker.terminate(); - }; +export function terminateImpl(worker) { + worker.terminate(); } -export function onMessage(f) { - return function (worker) { - return function () { - worker.onmessage = function (ev) { - f(ev)(); - }; - }; - }; +export function onMessageImpl(worker, f) { + worker.onmessage = f; } -export function onMessageError(f) { - return function (worker) { - return function () { - worker.onmessageerror = function (ev) { - f(ev)(); - }; - }; - }; +export function onMessageErrorImpl(worker, f) { + worker.onmessageerror = f; } -export function onError(f) { - return function (worker) { - return function () { - worker.onerror = function (ev) { - f(ev)(); - }; - }; - }; +export function onErrorImpl(worker, f) { + worker.onerror = f; } diff --git a/src/Web/Worker/Worker.purs b/src/Web/Worker/Worker.purs index 99636ba..9cb5fa1 100644 --- a/src/Web/Worker/Worker.purs +++ b/src/Web/Worker/Worker.purs @@ -14,18 +14,18 @@ module Web.Worker.Worker ) where import Prelude + import Data.Maybe (Maybe) import Effect (Effect) +import Effect.Uncurried (EffectFn1, EffectFn2, EffectFn3, mkEffectFn1, runEffectFn1, runEffectFn2, runEffectFn3) import Unsafe.Coerce (unsafeCoerce) import Web.Event.Event (Event) import Web.Event.EventTarget (EventTarget) import Web.Internal.FFI (unsafeReadProtoTagged) import Web.Worker.MessageEvent (MessageEvent) -import Web.Worker.Types (Transferable) +import Web.Worker.Options (WorkerOptions, Credentials(..), WorkerType(..), defaultWorkerOptions) as Options import Web.Worker.Options (WorkerOptions, toJsOptions) -import Web.Worker.Options (WorkerOptions, Credentials(..), - WorkerType(..), defaultWorkerOptions - ) as Options +import Web.Worker.Types (Transferable) foreign import data Worker :: Type @@ -35,30 +35,42 @@ fromEventTarget = unsafeReadProtoTagged "Worker" toEventTarget :: Worker -> EventTarget toEventTarget = unsafeCoerce -foreign import _new :: String -> { name :: String, credentials :: String, type :: String } -> Effect Worker +foreign import newImpl :: EffectFn2 String { name :: String, credentials :: String, type :: String } Worker -- | creates a worker object that executes the script at the specified URL. new :: String -> WorkerOptions -> Effect Worker -new url options = _new url (toJsOptions options) +new url options = runEffectFn2 newImpl url (toJsOptions options) -foreign import postMessageImpl :: forall msg. msg -> Array Transferable -> Worker -> Effect Unit +foreign import postMessageImpl :: forall msg. EffectFn3 Worker msg (Array Transferable) Unit -- | sends a message to the worker's inner scope. postMessage :: forall msg. msg -> Worker -> Effect Unit -postMessage msg = postMessageImpl msg [] +postMessage msg worker = postMessage' msg [] worker postMessage' :: forall msg. msg -> Array Transferable -> Worker -> Effect Unit -postMessage' = postMessageImpl +postMessage' msg tr worker = runEffectFn3 postMessageImpl worker msg tr -- | immediately terminates the worker. -- | This does not offer the worker an opportunity to finish its operations; it is stopped at once. -foreign import terminate :: Worker -> Effect Unit +terminate :: Worker -> Effect Unit +terminate worker = runEffectFn1 terminateImpl worker + +foreign import terminateImpl :: EffectFn1 Worker Unit -- | fired when the worker's parent receives a message from its worker -foreign import onMessage :: (MessageEvent -> Effect Unit) -> Worker -> Effect Unit +onMessage :: (MessageEvent -> Effect Unit) -> Worker -> Effect Unit +onMessage cb worker = runEffectFn2 onMessageImpl worker (mkEffectFn1 cb) + +foreign import onMessageImpl :: EffectFn2 Worker (EffectFn1 MessageEvent Unit) Unit -- | fired when the worker's parent receives a message that can't be deserialized. -foreign import onMessageError :: (MessageEvent -> Effect Unit) -> Worker -> Effect Unit +onMessageError :: (MessageEvent -> Effect Unit) -> Worker -> Effect Unit +onMessageError cb worker = runEffectFn2 onMessageErrorImpl worker (mkEffectFn1 cb) + +foreign import onMessageErrorImpl :: EffectFn2 Worker (EffectFn1 MessageEvent Unit) Unit -- | fired when an error occurs in the worker. -foreign import onError :: (Event -> Effect Unit) -> Worker -> Effect Unit +onError :: (Event -> Effect Unit) -> Worker -> Effect Unit +onError cb worker = runEffectFn2 onErrorImpl worker (mkEffectFn1 cb) + +foreign import onErrorImpl :: EffectFn2 Worker (EffectFn1 Event Unit) Unit From a988b0f32ee5f8f2c4d79787f48a19633040205c Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:04:04 -0600 Subject: [PATCH 02/11] Add a changelog --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..24e384c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,33 @@ +# Changelog + +Notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +Breaking changes: +- Refactored `Worker` to better match the spec + +New features: +- Added `SharedWorker` bindings + +Bugfixes: + +Other improvements: +- added documentation +- dropped `bower.json` file + +## [v1.1.0](https://github.com/purescript-web/purescript-web-workers/releases/tag/v1.1.0) - 2022-05-2 + +- purty and export MessageEvent.ports +- +## [v1.0.0](https://github.com/purescript-web/purescript-web-workers/releases/tag/v1.0.0) - 2022-05-17 + +- Update README.md + +## [v0.2.0](https://github.com/purescript-web/purescript-web-workers/releases/tag/v0.2.0) - 2022-05-16 + +Update `bower.json` + +## [v0.1.0](https://github.com/purescript-web/purescript-web-workers/releases/tag/v0.1.0) - 2022-05-16 + +- Initial release From 7c6dc599fd8bb562d123e7a28b0e73914822afce Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:05:31 -0600 Subject: [PATCH 03/11] Update eslint config to match web-dom's Keeping these files the same helps when updating the ecosystem due to compiler breaking changes --- .eslintrc.json | 55 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 946de62..3a97d05 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,30 +1,29 @@ { - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "extends": "eslint:recommended", - "env": { - "browser": true - }, - "rules": { - "strict": [2, "global"], - "block-scoped-var": 2, - "consistent-return": 2, - "eqeqeq": [2, "smart"], - "guard-for-in": 2, - "no-caller": 2, - "no-extend-native": 2, - "no-loop-func": 2, - "no-new": 2, - "no-param-reassign": 2, - "no-return-assign": 2, - "no-unused-expressions": 2, - "no-use-before-define": 2, - "radix": [2, "always"], - "indent": [2, 2], - "quotes": [2, "double"], - "semi": [2, "always"] - } + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "extends": "eslint:recommended", + "env": { + "browser": true + }, + "rules": { + "strict": [2, "global"], + "block-scoped-var": 2, + "consistent-return": 2, + "eqeqeq": [2, "smart"], + "guard-for-in": 2, + "no-caller": 2, + "no-extend-native": 2, + "no-loop-func": 2, + "no-new": 2, + "no-param-reassign": 2, + "no-return-assign": 2, + "no-unused-expressions": 2, + "no-use-before-define": 2, + "radix": [2, "always"], + "indent": [2, 2], + "quotes": [2, "double"], + "semi": [2, "always"] } - +} From 6c5a124c616cd1b20635686056d14c0523a422c2 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:09:28 -0600 Subject: [PATCH 04/11] Add .github folder from web-dom --- .github/ISSUE_TEMPLATE/bug_report.md | 10 ++++++++++ .github/ISSUE_TEMPLATE/feature-request.md | 16 ++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..1b182fe --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,10 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..0acfc72 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,16 @@ +--- +name: Feature request +about: Suggest types, functions, properties that may be missing +title: '' +labels: enhancement +assignees: '' + +--- + +### Prerequisites + +- [ ] Before opening an issue, please check the [W3C Web Workers standard](https://html.spec.whatwg.org/multipage/workers.html). If it doesn't appear in this spec, it may be present in the spec for one of the other `purescript-web` projects. Although MDN is a great resource, it is not a suitable reference for this project. + +### Description + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a26ae02 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +**Prerequisites** + +- [ ] Before opening a pull request, please check the DOM standard (https://dom.spec.whatwg.org/). If it doesn't appear in this spec, it may be present in the spec for one of the other `purescript-web` projects. Although MDN is a great resource, it is not a suitable reference for this project. + +**Description of the change** + +Clearly and concisely describe the purpose of the pull request. If this PR relates to an existing issue or change proposal, please link to it. Include any other background context that would help reviewers understand the motivation for this PR. + +--- + +**Checklist:** + +- [ ] Added the change to the changelog's "Unreleased" section with a reference to this PR (e.g. "- Made a change (#0000)") +- [ ] Linked any existing issues or proposals that this pull request should close +- [ ] Updated or added relevant documentation +- [ ] Added a test for the contribution (if applicable) From 2e20ccc3c94be7c7a77c6ccc7dc6bb43b3139175 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:09:54 -0600 Subject: [PATCH 05/11] Add modified ci.yml file from form-urlencoded --- .github/workflows/ci.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cea45af --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up a PureScript toolchain + uses: purescript-contrib/setup-purescript@main + with: + purescript: "unstable" + purs-tidy: "latest" + + - name: Cache PureScript dependencies + uses: actions/cache@v2 + with: + key: ${{ runner.os }}-spago-${{ hashFiles('**/*.dhall') }} + path: | + .spago + output + + - name: Install dependencies + run: spago install + + - name: Build source + run: spago build --no-install --purs-args '--censor-lib --strict' + + - name: Check formatting + run: purs-tidy check src From f978a217090fdb60ab5caf951e077f37b3f8ecf8 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:10:39 -0600 Subject: [PATCH 06/11] Update changelog --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24e384c..e2a1152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,10 @@ New features: Bugfixes: Other improvements: -- added documentation -- dropped `bower.json` file +- Added documentation +- Dropped `bower.json` file +- Added CI and GitHub issue/pr templates +- Added `purs-tidy` formatter to CI ## [v1.1.0](https://github.com/purescript-web/purescript-web-workers/releases/tag/v1.1.0) - 2022-05-2 From 7c628413fbed8dfcd5b90df506319f456447493a Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:11:08 -0600 Subject: [PATCH 07/11] Update changelog again --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2a1152..c93e806 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Bugfixes: Other improvements: - Added documentation - Dropped `bower.json` file +- Updated FFI to use `EffectFnX` types - Added CI and GitHub issue/pr templates - Added `purs-tidy` formatter to CI From 2097175e55a5a2a5296672f1ed38901c5c193e94 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:11:47 -0600 Subject: [PATCH 08/11] Drop comments in packages.dhall file --- packages.dhall | 100 ------------------------------------------------- 1 file changed, 100 deletions(-) diff --git a/packages.dhall b/packages.dhall index 6b9d320..e51557d 100644 --- a/packages.dhall +++ b/packages.dhall @@ -1,103 +1,3 @@ -{- -Welcome to your new Dhall package-set! - -Below are instructions for how to edit this file for most use -cases, so that you don't need to know Dhall to use it. - -## Use Cases - -Most will want to do one or both of these options: -1. Override/Patch a package's dependency -2. Add a package not already in the default package set - -This file will continue to work whether you use one or both options. -Instructions for each option are explained below. - -### Overriding/Patching a package - -Purpose: -- Change a package's dependency to a newer/older release than the - default package set's release -- Use your own modified version of some dependency that may - include new API, changed API, removed API by - using your custom git repo of the library rather than - the package set's repo - -Syntax: -where `entityName` is one of the following: -- dependencies -- repo -- version -------------------------------- -let upstream = -- -in upstream - with packageName.entityName = "new value" -------------------------------- - -Example: -------------------------------- -let upstream = -- -in upstream - with halogen.version = "master" - with halogen.repo = "https://example.com/path/to/git/repo.git" - - with halogen-vdom.version = "v4.0.0" - with halogen-vdom.dependencies = [ "extra-dependency" ] # halogen-vdom.dependencies -------------------------------- - -### Additions - -Purpose: -- Add packages that aren't already included in the default package set - -Syntax: -where `` is: -- a tag (i.e. "v4.0.0") -- a branch (i.e. "master") -- commit hash (i.e. "701f3e44aafb1a6459281714858fadf2c4c2a977") -------------------------------- -let upstream = -- -in upstream - with new-package-name = - { dependencies = - [ "dependency1" - , "dependency2" - ] - , repo = - "https://example.com/path/to/git/repo.git" - , version = - "" - } -------------------------------- - -Example: -------------------------------- -let upstream = -- -in upstream - with benchotron = - { dependencies = - [ "arrays" - , "exists" - , "profunctor" - , "strings" - , "quickcheck" - , "lcg" - , "transformers" - , "foldable-traversable" - , "exceptions" - , "node-fs" - , "node-buffer" - , "node-readline" - , "datetime" - , "now" - ] - , repo = - "https://github.com/hdgarrood/purescript-benchotron.git" - , version = - "v7.0.0" - } -------------------------------- --} let upstream = https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20230105/packages.dhall sha256:3e9fbc9ba03e9a1fcfd895f65e2d50ee2f5e86c4cd273f3d5c841b655a0e1bda From b5a1f81d32e99740170f3b5636c15226009dc464 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:12:01 -0600 Subject: [PATCH 09/11] Tweak changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c93e806..fe8f367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ Bugfixes: Other improvements: - Added documentation -- Dropped `bower.json` file +- Migrated from `pulp`/`bower` to `spago` - Updated FFI to use `EffectFnX` types - Added CI and GitHub issue/pr templates - Added `purs-tidy` formatter to CI From e5ad7335406fc6bece521a6f08bf7bc16014f389 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:14:32 -0600 Subject: [PATCH 10/11] Update Show instances; note in changelog --- CHANGELOG.md | 2 ++ src/Web/Worker/Options.purs | 17 +++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe8f367..029f3dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,11 @@ Notable changes to this project are documented in this file. The format is based Breaking changes: - Refactored `Worker` to better match the spec +- Refactored `Credentials`' `Show` instance to be more `Show`-like; use `printCredentials` now New features: - Added `SharedWorker` bindings +- Added `Show` instance to `WorkerType` Bugfixes: diff --git a/src/Web/Worker/Options.purs b/src/Web/Worker/Options.purs index 68f3992..3d998da 100644 --- a/src/Web/Worker/Options.purs +++ b/src/Web/Worker/Options.purs @@ -12,11 +12,22 @@ data WorkerType = Classic | Module Credentials +instance Show WorkerType where + show = case _ of + Classic -> "Classic" + Module creds -> "Module(" <> show creds <> ")" + data Credentials = Omit | SameOrigin | Include +instance Show Credentials where + show = case _ of + Omit -> "Omit" + SameOrigin -> "SameOrigin" + Include -> "Include" + type WorkerOptions = { name :: String , type :: WorkerType @@ -34,12 +45,6 @@ printCredentials = case _ of SameOrigin -> "same-origin" Include -> "include" -instance Show Credentials where - show = case _ of - Omit -> "Omit" - SameOrigin -> "SameOrigin" - Include -> "Include" - toJsOptions :: WorkerOptions -> { name :: String, credentials :: String, type :: String } toJsOptions { name, type: t } = case t of Classic -> From 991f35366cc745cf68799fb2fe875c66be12fa02 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 11 Jan 2023 10:18:26 -0600 Subject: [PATCH 11/11] Add functions to dependencies --- spago.dhall | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/spago.dhall b/spago.dhall index df5fdd1..d001c4e 100644 --- a/spago.dhall +++ b/spago.dhall @@ -1,5 +1,13 @@ { name = "web-workers" -, dependencies = [ "effect", "foreign", "maybe", "prelude", "unsafe-coerce", "web-events" ] +, dependencies = + [ "effect" + , "foreign" + , "functions" + , "maybe" + , "prelude" + , "unsafe-coerce" + , "web-events" + ] , packages = ./packages.dhall , sources = [ "src/**/*.purs" ] }