From e5863b1e4be720be3c67f56c3a5b3a2363d517e9 Mon Sep 17 00:00:00 2001 From: Nathan Faubion Date: Sat, 10 Nov 2018 19:23:38 -0800 Subject: [PATCH 01/12] Load individual modules on demand --- index.html | 1 + js/index.js | 239 ++++++++++++++++++++++++++++++++--------------- js/ps-loader.js | 111 ++++++++++++++++++++++ package.json | 2 +- src/Main.purs | 49 ++++------ src/Try/API.js | 2 + src/Try/API.purs | 28 +++++- 7 files changed, 324 insertions(+), 108 deletions(-) create mode 100644 js/ps-loader.js diff --git a/index.html b/index.html index 8e97044d..32e15e1e 100644 --- a/index.html +++ b/index.html @@ -15,6 +15,7 @@ + diff --git a/js/index.js b/js/index.js index 94258e73..e797ba43 100644 --- a/js/index.js +++ b/js/index.js @@ -3671,16 +3671,6 @@ var PS = {}; }; }; }; - - exports["replace'"] = function (r) { - return function (f) { - return function (s2) { - return s2.replace(r, function (match) { - return f(match)(Array.prototype.splice.call(arguments, 1, arguments.length - 3)); - }); - }; - }; - }; })(PS["Data.String.Regex"] = PS["Data.String.Regex"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -3767,7 +3757,6 @@ var PS = {}; exports["regex"] = regex; exports["renderFlags"] = renderFlags; exports["replace"] = $foreign.replace; - exports["replace'"] = $foreign["replace'"]; })(PS["Data.String.Regex"] = PS["Data.String.Regex"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -3857,6 +3846,10 @@ var PS = {}; (function(exports) { "use strict"; + exports.unsafeToForeign = function (value) { + return value; + }; + exports.unsafeFromForeign = function (value) { return value; }; @@ -4008,6 +4001,7 @@ var PS = {}; exports["readInt"] = readInt; exports["readArray"] = readArray; exports["fail"] = fail; + exports["unsafeToForeign"] = $foreign.unsafeToForeign; exports["typeOf"] = $foreign.typeOf; exports["isNull"] = $foreign.isNull; exports["isUndefined"] = $foreign.isUndefined; @@ -4053,6 +4047,16 @@ var PS = {}; return f(); }; + exports._mapWithKey = function (m0, f) { + var m = {}; + for (var k in m0) { + if (hasOwnProperty.call(m0, k)) { + m[k] = f(k)(m0[k]); + } + } + return m; + }; + exports._foldM = function (bind) { return function (f) { return function (mz) { @@ -4162,8 +4166,18 @@ var PS = {}; return v; }); }; + }; + var mapWithKey = function (f) { + return function (m) { + return $foreign._mapWithKey(m, f); + }; }; var lookup = Data_Function_Uncurried.runFn4($foreign._lookup)(Data_Maybe.Nothing.value)(Data_Maybe.Just.create); + var insert = function (k) { + return function (v) { + return mutate(Foreign_Object_ST.poke(k)(v)); + }; + }; var fromFoldable = function (dictFoldable) { return function (l) { return $foreign.runST(function __do() { @@ -4211,8 +4225,10 @@ var PS = {}; }); }; exports["singleton"] = singleton; + exports["insert"] = insert; exports["lookup"] = lookup; exports["fromFoldable"] = fromFoldable; + exports["mapWithKey"] = mapWithKey; exports["union"] = union; exports["foldM"] = foldM; exports["thawST"] = thawST; @@ -4244,9 +4260,23 @@ var PS = {}; var Prelude = PS["Prelude"]; var Decode = function (decode) { this.decode = decode; - }; + }; + var Encode = function (encode) { + this.encode = encode; + }; + var stringEncode = new Encode(Foreign.unsafeToForeign); var stringDecode = new Decode(Foreign.readString); - var intDecode = new Decode(Foreign.readInt); + var intDecode = new Decode(Foreign.readInt); + var encode = function (dict) { + return dict.encode; + }; + var objectEncode = function (dictEncode) { + return new Encode(function ($11) { + return Foreign.unsafeToForeign(Foreign_Object.mapWithKey(function (v) { + return encode(dictEncode); + })($11)); + }); + }; var decode = function (dict) { return dict.decode; }; @@ -4267,11 +4297,15 @@ var PS = {}; })()); }; exports["decode"] = decode; + exports["encode"] = encode; exports["Decode"] = Decode; + exports["Encode"] = Encode; exports["stringDecode"] = stringDecode; exports["intDecode"] = intDecode; exports["arrayDecode"] = arrayDecode; exports["maybeDecode"] = maybeDecode; + exports["stringEncode"] = stringEncode; + exports["objectEncode"] = objectEncode; })(PS["Foreign.Class"] = PS["Foreign.Class"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -4682,13 +4716,18 @@ var PS = {}; })(PS["Foreign.Generic.Class"] = PS["Foreign.Generic.Class"] || {}); (function(exports) { /* globals exports, JSON */ - "use strict"; + "use strict"; + + exports.unsafeStringify = function (x) { + return JSON.stringify(x); + }; exports.unsafeDecodeURIComponent = decodeURIComponent; })(PS["Global.Unsafe"] = PS["Global.Unsafe"] || {}); (function(exports) { // Generated by purs version 0.12.0 "use strict"; var $foreign = PS["Global.Unsafe"]; + exports["unsafeStringify"] = $foreign.unsafeStringify; exports["unsafeDecodeURIComponent"] = $foreign.unsafeDecodeURIComponent; })(PS["Global.Unsafe"] = PS["Global.Unsafe"] || {}); (function(exports) { @@ -4717,6 +4756,11 @@ var PS = {}; }; }; }; + var encodeJSON = function (dictEncode) { + return function ($13) { + return Global_Unsafe.unsafeStringify(Foreign_Class.encode(dictEncode)($13)); + }; + }; var defaultOptions = { sumEncoding: new Foreign_Generic_Types.TaggedObject({ tagFieldName: "tag", @@ -4729,6 +4773,7 @@ var PS = {}; }; exports["defaultOptions"] = defaultOptions; exports["genericDecode"] = genericDecode; + exports["encodeJSON"] = encodeJSON; })(PS["Foreign.Generic"] = PS["Foreign.Generic"] || {}); (function(exports) { /* global exports */ @@ -4951,6 +4996,8 @@ var PS = {}; (function(exports) { "use strict"; + exports.resolver_ = PSResolver; + exports.get_ = function(uri, done, fail) { $.get(uri).done(done).fail(function(err) { fail(err.statusText); @@ -4987,8 +5034,7 @@ var PS = {}; exports["newtypeJS"] = newtypeJS; })(PS["Try.Types"] = PS["Try.Types"] || {}); (function(exports) { - // Generated by purs version 0.12.0 - "use strict"; + "use strict"; var $foreign = PS["Try.API"]; var Control_Alt = PS["Control.Alt"]; var Control_Category = PS["Control.Category"]; @@ -5026,9 +5072,12 @@ var PS = {}; var Foreign_Generic = PS["Foreign.Generic"]; var Foreign_Generic_Class = PS["Foreign.Generic.Class"]; var Foreign_Generic_Types = PS["Foreign.Generic.Types"]; + var Foreign_Object = PS["Foreign.Object"]; var Partial_Unsafe = PS["Partial.Unsafe"]; var Prelude = PS["Prelude"]; var Try_Types = PS["Try.Types"]; + + // | An error reported from the compile API. var CompilerErrors = (function () { function CompilerErrors(value0) { this.value0 = value0; @@ -5038,6 +5087,8 @@ var PS = {}; }; return CompilerErrors; })(); + + // | An error reported from the compile API. var OtherError = (function () { function OtherError(value0) { this.value0 = value0; @@ -5047,6 +5098,8 @@ var PS = {}; }; return OtherError; })(); + + // | The result of calling the compile API. var CompileSuccess = (function () { function CompileSuccess(value0) { this.value0 = value0; @@ -5056,6 +5109,8 @@ var PS = {}; }; return CompileSuccess; })(); + + // | The result of calling the compile API. var CompileFailed = (function () { function CompileFailed(value0) { this.value0 = value0; @@ -5107,6 +5162,16 @@ var PS = {}; Flare.value = new Flare(); return Flare; })(); + var resolver = function (output) { + var go = $foreign.resolver_(output); + return function (src) { + return function (k) { + return go(src)(k); + }; + }; + }; + + // | A wrapper for `get` which uses `ContT`. var get = function (uri) { return function (k) { return function () { @@ -5118,9 +5183,13 @@ var PS = {}; }; }; }; + + // | Get the default bundle var getDefaultBundle = function (endpoint) { return Data_Functor.map(Control_Monad_Except_Trans.functorExceptT(Control_Monad_Cont_Trans.functorContT(Effect.functorEffect)))(Try_Types.JS)(get(endpoint + "/bundle")); }; + + // | Get the JS bundle for the Thermite backend, which includes additional dependencies var getThermiteBundle = function (endpoint) { var onComplete = function (dictPartial) { return function (v) { @@ -5134,7 +5203,7 @@ var PS = {}; var replaced = Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react-dom\\/server\"\\)")(Data_String_Regex_Flags.global))("window.ReactDOM")(Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react-dom\"\\)")(Data_String_Regex_Flags.global))("window.ReactDOM")(Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react\"\\)")(Data_String_Regex_Flags.global))("window.React")(v[3]))); return Data_Foldable.intercalate(Data_Foldable.foldableArray)(Data_Monoid.monoidString)("\x0a")([ v[0], v[1], v[2], replaced ]); }; - throw new Error("Failed pattern match at Try.API line 164, column 7 - line 166, column 23: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Try.API line 165, column 7 - line 167, column 23: " + [ v.constructor.name ]); })()); }; }; @@ -5178,7 +5247,7 @@ var PS = {}; if (x instanceof OtherError) { return new Data_Generic_Rep.Inr(x.value0); }; - throw new Error("Failed pattern match at Try.API line 71, column 8 - line 71, column 62: " + [ x.constructor.name ]); + throw new Error("Failed pattern match at Try.API line 72, column 8 - line 72, column 62: " + [ x.constructor.name ]); }, function (x) { if (x instanceof Data_Generic_Rep.Inl) { return new CompilerErrors(x.value0); @@ -5186,7 +5255,7 @@ var PS = {}; if (x instanceof Data_Generic_Rep.Inr) { return new OtherError(x.value0); }; - throw new Error("Failed pattern match at Try.API line 71, column 8 - line 71, column 62: " + [ x.constructor.name ]); + throw new Error("Failed pattern match at Try.API line 72, column 8 - line 72, column 62: " + [ x.constructor.name ]); }); var decodingOptions = { sumEncoding: Foreign_Generic.defaultOptions.sumEncoding, @@ -5244,6 +5313,8 @@ var PS = {}; unwrapSingleArguments: Foreign_Generic.defaultOptions.unwrapSingleArguments, fieldTransform: Foreign_Generic.defaultOptions.fieldTransform })); + + // | Parse the result from the compile API and verify it var decodeCompileResult = new Foreign_Class.Decode(function (f) { return Control_Alt.alt(Control_Monad_Except_Trans.altExceptT(Data_List_Types.semigroupNonEmptyList)(Data_Identity.monadIdentity))(Data_Functor.map(Control_Monad_Except_Trans.functorExceptT(Data_Identity.functorIdentity))(CompileSuccess.create)(Foreign_Generic.genericDecode(genericSuccessResult)(Foreign_Generic_Class.genericDecodeConstructor(new Data_Symbol.IsSymbol(function () { return "SuccessResult"; @@ -5257,6 +5328,8 @@ var PS = {}; return "error"; }))(Foreign_Generic_Class.decode_Other(decodeCompileError))())))(Foreign_Generic_Class.genericCountArgsArgument))(decodingOptions)(f))); }); + + // | A wrapper for `compileApi` which uses `ContT`. var compile = function (endpoint) { return function (code) { return function (k) { @@ -5270,6 +5343,8 @@ var PS = {}; }; }; }; + + // TODO: Fix paths var getBackendConfig = function (v) { if (v instanceof Core) { return { @@ -5277,8 +5352,9 @@ var PS = {}; mainGist: "b57a766d417e109785540d584266fc33", extra_styling: "", extra_body: "", - compile: compile("https://compile.purescript.org/try"), - getBundle: getDefaultBundle("https://compile.purescript.org/try") + resolve: resolver("staging/core/.psci_modules/node_modules"), + compile: compile("http://localhost:8081"), + getBundle: getDefaultBundle("http://localhost:8081") }; }; if (v instanceof Thermite) { @@ -5287,6 +5363,7 @@ var PS = {}; mainGist: "85383bb058471109cfef379bbb6bc11c", extra_styling: "", extra_body: "
", + resolve: resolver("staging/thermite/.psci-modules/node_modules"), compile: compile("https://compile.purescript.org/thermite"), getBundle: getThermiteBundle("https://compile.purescript.org/thermite") }; @@ -5297,6 +5374,7 @@ var PS = {}; mainGist: "c62b5778a6a5f2bcd32dd97b294c068a", extra_styling: "", extra_body: "
", + resolve: resolver("staging/slides/.psci-modules/node_modules"), compile: compile("https://compile.purescript.org/slides"), getBundle: getDefaultBundle("https://compile.purescript.org/slides") }; @@ -5307,6 +5385,7 @@ var PS = {}; mainGist: "81f8bb3261b9c819d677de2ea54a4d2e", extra_styling: Data_Foldable.fold(Data_Foldable.foldableArray)(Data_Monoid.monoidString)([ "", "" ]), extra_body: "", + resolve: resolver("staging/mathbox/.psci-modules/node_modules"), compile: compile("https://compile.purescript.org/purescript-mathbox"), getBundle: getDefaultBundle("https://compile.purescript.org/purescript-mathbox") }; @@ -5317,6 +5396,7 @@ var PS = {}; mainGist: "ff1e87f0872d2d891e77d209d8f7706d", extra_styling: "", extra_body: "", + resolve: resolver("staging/behaviors/.psci-modules/node_modules"), compile: compile("https://compile.purescript.org/behaviors"), getBundle: getDefaultBundle("https://compile.purescript.org/behaviors") }; @@ -5327,11 +5407,12 @@ var PS = {}; mainGist: "4f54d6dd213caa54d736ead597e17fee", extra_styling: "", extra_body: Data_Foldable.fold(Data_Foldable.foldableArray)(Data_Monoid.monoidString)([ "
", "
", "
", "" ]), + resolve: resolver("staging/flare/.psci-modules/node_modules"), compile: compile("https://compile.purescript.org/flare"), getBundle: getDefaultBundle("https://compile.purescript.org/flare") }; }; - throw new Error("Failed pattern match at Try.API line 231, column 1 - line 231, column 45: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Try.API line 249, column 1 - line 249, column 45: " + [ v.constructor.name ]); }; var backendFromString = function (dictPartial) { return function (v) { @@ -5359,7 +5440,7 @@ var PS = {}; if (v === "flare") { return Flare.value; }; - throw new Error("Failed pattern match at Try.API line 212, column 1 - line 212, column 50: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Try.API line 229, column 1 - line 229, column 50: " + [ v.constructor.name ]); })()); }; }; @@ -5804,8 +5885,7 @@ var PS = {}; exports["window"] = $foreign.window; })(PS["Web.HTML"] = PS["Web.HTML"] || {}); (function(exports) { - // Generated by purs version 0.12.0 - "use strict"; + "use strict"; var $foreign = PS["Main"]; var Control_Applicative = PS["Control.Applicative"]; var Control_Bind = PS["Control.Bind"]; @@ -5828,17 +5908,15 @@ var PS = {}; var Data_Semiring = PS["Data.Semiring"]; var Data_Show = PS["Data.Show"]; var Data_String = PS["Data.String"]; - var Data_String_CodePoints = PS["Data.String.CodePoints"]; var Data_String_Common = PS["Data.String.Common"]; - var Data_String_Regex = PS["Data.String.Regex"]; - var Data_String_Regex_Flags = PS["Data.String.Regex.Flags"]; - var Data_String_Regex_Unsafe = PS["Data.String.Regex.Unsafe"]; var Data_Unit = PS["Data.Unit"]; var Effect = PS["Effect"]; var Effect_Console = PS["Effect.Console"]; var Effect_Timer = PS["Effect.Timer"]; var Effect_Uncurried = PS["Effect.Uncurried"]; var Foreign = PS["Foreign"]; + var Foreign_Class = PS["Foreign.Class"]; + var Foreign_Generic = PS["Foreign.Generic"]; var Foreign_Object = PS["Foreign.Object"]; var JQuery = PS["JQuery"]; var JQuery_Extras = PS["JQuery.Extras"]; @@ -5854,6 +5932,8 @@ var PS = {}; var setTextAreaContent = function (value) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery.setValue(value)); }; + + // | Navigate to the specified URL. var navigateTo = function (uri) { return Data_Functor["void"](Effect.functorEffect)(Control_Bind.bind(Effect.bindEffect)(Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.location))(Web_HTML_Location.setHref(uri))); }; @@ -5878,7 +5958,7 @@ var PS = {}; backend: backend }); }; - throw new Error("Failed pattern match at Main line 264, column 5 - line 268, column 40: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Main line 253, column 5 - line 257, column 40: " + [ v.constructor.name ]); }); }; }; @@ -5894,13 +5974,13 @@ var PS = {}; })(); }; if (v instanceof Data_Maybe.Nothing) { - var v1 = Data_Functor.map(Effect.functorEffect)(function ($136) { - return Try_API.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($136)); + var v1 = Data_Functor.map(Effect.functorEffect)(function ($132) { + return Try_API.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($132)); })(Try_QueryString.getQueryStringMaybe("backend"))(); var v2 = Data_Functor.map(Effect.functorEffect)(Data_Maybe.fromMaybe(v1.mainGist))(Try_QueryString.getQueryStringMaybe("gist"))(); return loadFromGist(v2)(v1)(k)(); }; - throw new Error("Failed pattern match at Main line 276, column 3 - line 282, column 29: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Main line 265, column 3 - line 271, column 29: " + [ v.constructor.name ]); }; }; }; @@ -5914,6 +5994,8 @@ var PS = {}; }; var hideLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeOut); var getTextAreaContent = Data_Functor.map(Effect.functorEffect)(Data_Foldable.fold(Data_Foldable.foldableMaybe)(Data_Monoid.monoidString))(Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery_Extras.getValueMaybe)); + + // | Create a new Gist using the current content var publishNewGist = function (v) { return function __do() { var v1 = Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.confirm(Data_Foldable.intercalate(Data_Foldable.foldableArray)(Data_Monoid.monoidString)("\x0a")([ "Do you really want to publish this code as an anonymous Gist?", "", "Note: this code will be available to anyone with a link to the Gist." ])))(); @@ -5929,22 +6011,19 @@ var PS = {}; if (v3 instanceof Data_Either.Right) { return Try_QueryString.setQueryStrings(Data_Semigroup.append(Foreign_Object.semigroupObject(Data_Semigroup.semigroupString))(Foreign_Object.singleton("gist")(v3.value0))(Foreign_Object.singleton("backend")(v.backend))); }; - throw new Error("Failed pattern match at Main line 305, column 7 - line 311, column 71: " + [ v3.constructor.name ]); + throw new Error("Failed pattern match at Main line 294, column 7 - line 300, column 71: " + [ v3.constructor.name ]); })(); })(); }; }; + + // | Execute the compiled code in a new iframe. var execute = function (js) { - return function (bundle) { + return function (sources) { return function (v) { - var replaced = Data_String_Regex["replace'"](Data_String_Regex_Unsafe.unsafeRegex("require\\(\"[^\"]*\"\\)")(Data_String_Regex_Flags.global))(function (s) { - return function (v1) { - return "PS['" + (Data_String_CodePoints.drop(12)(Data_String_CodePoints.take(Data_String_CodePoints.length(s) - 11 | 0)(s)) + "']"); - }; - })(Data_Newtype.unwrap(Try_Types.newtypeJS)(js)); - var wrapped = Data_String_Common.joinWith("\x0a")([ "var module = {};", "(function(module) {", replaced, "})(module);", "module.exports.main && module.exports.main();" ]); - var scripts = Data_String_Common.joinWith("\x0a")([ Data_Newtype.unwrap(Try_Types.newtypeJS)(bundle), wrapped ]); - var html = Data_String_Common.joinWith("\x0a")([ "", "", " ", " ", " ", " ", " Try PureScript!", " ", v.extra_styling, " ", " ", v.extra_body, " ", "" ]); + var json = Foreign_Generic.encodeJSON(Foreign_Class.objectEncode(Foreign_Class.stringEncode))(Foreign_Object.insert("")(Data_Newtype.unwrap(Try_Types.newtypeJS)(js))(sources)); + var scripts = Data_String_Common.joinWith("\x0a")([ "var load = PSLoader(" + (json + ");"), "load(\"\").main();" ]); + var html = Data_String_Common.joinWith("\x0a")([ "", "", " ", " ", " ", " ", " Try PureScript!", " ", " ", v.extra_styling, " ", " ", v.extra_body, " ", "" ]); return function __do() { var v1 = JQuery.select("#column2")(); return $foreign.setupIFrame(v1, html, scripts); @@ -5952,6 +6031,8 @@ var PS = {}; }; }; }; + + // | Display plain text in the right hand column. var displayPlainText = function (s) { return function __do() { var v = JQuery.select("#column2")(); @@ -5964,6 +6045,8 @@ var PS = {}; }; }; var displayLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeIn); + + // | Display a list of errors in the right hand column. var displayErrors = function (errs) { return function __do() { var v = JQuery.select("#column2")(); @@ -5988,6 +6071,8 @@ var PS = {}; var clearAnnotations = function () { return $foreign.setAnnotations([ ]); }; + + // | Compile the current code and execute it. var compile = function (v) { return function __do() { var v1 = getTextAreaContent(); @@ -6006,31 +6091,25 @@ var PS = {}; hideLoadingMessage(); return displayPlainText(res_.value0.value0.value0.js)(); }; - return Control_Monad_Cont_Trans.runContT(Control_Monad_Except_Trans.runExceptT(v.getBundle))(function (bundleResult) { + return Control_Monad_Cont_Trans.runContT(v.resolve(res_.value0.value0.value0.js))(function (sources) { return function __do() { hideLoadingMessage(); - if (bundleResult instanceof Data_Either.Left) { - return Effect_Console.error("Unable to retrieve JS bundle: " + bundleResult.value0)(); - }; - if (bundleResult instanceof Data_Either.Right) { - Data_Foldable.for_(Effect.applicativeEffect)(Data_Foldable.foldableMaybe)(res_.value0.value0.value0.warnings)(function (warnings_) { - var toAnnotation = function (v3) { - return Data_Functor.mapFlipped(Data_Maybe.functorMaybe)(v3.position)(function (v4) { - return { - row: v4.startLine - 1 | 0, - column: v4.startColumn - 1 | 0, - type: "warning", - text: v3.message - }; - }); - }; - return function () { - return $foreign.setAnnotations(Data_Array.mapMaybe(toAnnotation)(warnings_)); - }; - })(); - return execute(res_.value0.value0.value0.js)(bundleResult.value0)(v)(); - }; - throw new Error("Failed pattern match at Main line 151, column 22 - line 163, column 51: " + [ bundleResult.constructor.name ]); + Data_Foldable.for_(Effect.applicativeEffect)(Data_Foldable.foldableMaybe)(res_.value0.value0.value0.warnings)(function (warnings_) { + var toAnnotation = function (v3) { + return Data_Functor.mapFlipped(Data_Maybe.functorMaybe)(v3.position)(function (v4) { + return { + row: v4.startLine - 1 | 0, + column: v4.startColumn - 1 | 0, + type: "warning", + text: v3.message + }; + }); + }; + return function () { + return $foreign.setAnnotations(Data_Array.mapMaybe(toAnnotation)(warnings_)); + }; + })(); + return execute(res_.value0.value0.value0.js)(sources)(v)(); }; })(); }; @@ -6060,27 +6139,31 @@ var PS = {}; if (res_.value0.value0.value0.error instanceof Try_API.OtherError) { return displayPlainText(res_.value0.value0.value0.error.value0)(); }; - throw new Error("Failed pattern match at Main line 166, column 13 - line 187, column 53: " + [ res_.value0.value0.value0.error.constructor.name ]); + throw new Error("Failed pattern match at Main line 160, column 13 - line 181, column 53: " + [ res_.value0.value0.value0.error.constructor.name ]); }; if (res_.value0 instanceof Data_Either.Left) { hideLoadingMessage(); displayPlainText("Unable to parse the response from the server")(); - return Data_Foldable.traverse_(Effect.applicativeEffect)(Data_List_Types.foldableNonEmptyList)(function ($137) { - return Effect_Console.error(Foreign.renderForeignError($137)); + return Data_Foldable.traverse_(Effect.applicativeEffect)(Data_List_Types.foldableNonEmptyList)(function ($133) { + return Effect_Console.error(Foreign.renderForeignError($133)); })(res_.value0.value0)(); }; - throw new Error("Failed pattern match at Main line 143, column 9 - line 191, column 58: " + [ res_.value0.constructor.name ]); + throw new Error("Failed pattern match at Main line 140, column 9 - line 185, column 58: " + [ res_.value0.constructor.name ]); }; }; - throw new Error("Failed pattern match at Main line 138, column 5 - line 191, column 58: " + [ res_.constructor.name ]); + throw new Error("Failed pattern match at Main line 135, column 5 - line 185, column 58: " + [ res_.constructor.name ]); })(); }; }; + + // | Update the view mode based on the menu selection var changeViewMode = function (viewMode) { return Data_Foldable.for_(Effect.applicativeEffect)(Data_Foldable.foldableMaybe)(viewMode)(function (viewMode_) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#editor_view"))(JQuery.setAttr("data-view-mode")(viewMode_)); }); }; + + // | Read query string options and update the state accordingly var loadOptions = function (bc) { return function __do() { var v = Try_QueryString.getQueryStringMaybe("view")(); @@ -6113,9 +6196,11 @@ var PS = {}; if (v3 instanceof Data_Maybe.Nothing) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select(".view_gist_li"))(JQuery.hide)(); }; - throw new Error("Failed pattern match at Main line 340, column 3 - line 342, column 61: " + [ v3.constructor.name ]); + throw new Error("Failed pattern match at Main line 329, column 3 - line 331, column 61: " + [ v3.constructor.name ]); }; }; + + // | Cache the current code in the session state var cacheCurrentCode = function (v) { return function __do() { var v1 = Try_QueryString.getQueryStringMaybe("session")(); @@ -6129,9 +6214,11 @@ var PS = {}; if (v1 instanceof Data_Maybe.Nothing) { return Effect_Console.error("No session ID")(); }; - throw new Error("Failed pattern match at Main line 288, column 3 - line 294, column 1: " + [ v1.constructor.name ]); + throw new Error("Failed pattern match at Main line 277, column 3 - line 283, column 1: " + [ v1.constructor.name ]); }; }; + + // | Setup event listeners for the backend dropdown menu. var setupBackendMenu = function (v) { return function __do() { Control_Bind.bind(Effect.bindEffect)(JQuery.select("#backend_" + v.backend))(JQuery.attr({ @@ -6140,8 +6227,8 @@ var PS = {}; return Control_Bind.bind(Effect.bindEffect)(JQuery.select("input[name=backend_inputs]"))(JQuery.on("change")(function (e) { return function (jq) { return function __do() { - var v1 = Data_Functor.map(Effect.functorEffect)(function ($138) { - return Try_API.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($138)); + var v1 = Data_Functor.map(Effect.functorEffect)(function ($134) { + return Try_API.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($134)); })(JQuery_Extras.getValueMaybe(jq))(); var v2 = Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.confirm("Replace your current code with the " + (v1.backend + " backend sample code?")))(); if (v2) { @@ -6156,6 +6243,8 @@ var PS = {}; }))(); }; }; + + // | Setup the editor component and some event handlers. var setupEditor = function (v) { return function __do() { loadOptions(v.backend)(); diff --git a/js/ps-loader.js b/js/ps-loader.js new file mode 100644 index 00000000..07d57dc8 --- /dev/null +++ b/js/ps-loader.js @@ -0,0 +1,111 @@ +var PSMODULE = /^\.\.\/(.*)+\/index\.js$/; + +function PSResolver(output) { + var REQUIRE = /(\/\*[\w\W]*?\*\/|\/\/[^\n]*|[.$]r)|\brequire\s*\(\s*["']([^"']*)["']\s*\)/g; + var CACHE = {}; + + function getDeps(current, src) { + var modules = []; + src.replace(REQUIRE, function(all, ignore, id) { + if (!ignore) { + if (id === "./foreign.js") { + modules.push({ + module: current + "$Foreign", + path: [output, current, "foreign.js"].join("/") + }) + } else { + var mod = id.match(PSMODULE)[1]; + modules.push({ + module: mod, + path: [output, mod, "index.js"].join("/") + }); + } + } + }); + return modules; + } + + function load(mod, path) { + var cached = CACHE[mod]; + if (cached) { + return Promise.resolve({ + module: mod, + src: cached + }); + } + return fetch(path) + .then(function(resp) { + return resp.text(); + }) + .then(function(src) { + return { + module: mod, + src: src + }; + }); + } + + function go(modules, accum) { + return Promise.all( + modules.map(function(dep) { + return load(dep.module, dep.path); + }) + ).then(function(sources) { + var pass = {}; + var more = []; + sources.forEach(function(source) { + CACHE[source.module] = source.src; + accum[source.module] = source.src; + var deps = getDeps(source.module, source.src); + deps.forEach(function(dep) { + if (!pass[dep.module]) { + pass[dep.module] = true; + more.push(dep); + } + }); + }); + if (more.length) { + return go(more, accum); + } else { + return accum; + } + }); + } + + return function(src) { + return function(cb) { + return function() { + go(getDeps("", src), {}).then(function(result) { + cb(result)(); + }).catch(function(err) { + console.error(err); + cb({}); + }); + }; + }; + }; +} + +function PSLoader(sources) { + var modules = {}; + return function load(name) { + if (modules[name]) { + return modules[name].exports; + } + var src = sources[name]; + if (src == null) { + throw new Error("Module not found: " + name); + } + function req(path) { + if (path === "./foreign.js") { + return load(name + "$Foreign"); + } else { + return load(path.match(PSMODULE)[1]); + } + } + var mod = { exports: {} }; + modules[name] = mod; + new Function("module", "exports", "require", src)(mod, mod.exports, req); + return mod.exports; + } +} diff --git a/package.json b/package.json index d9d9143f..74396aae 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "scripts": { "clean": "rimraf output && rimraf .pulp-cache", "build": "pulp build -- --censor-lib --strict", - "bundle": "pulp build -O --to js/index.js && open index.html" + "bundle": "pulp build -O --to js/index.js" }, "devDependencies": { "pulp": "^11.0.0", diff --git a/src/Main.purs b/src/Main.purs index 5ae596ff..fa593716 100644 --- a/src/Main.purs +++ b/src/Main.purs @@ -12,15 +12,12 @@ import Data.FoldableWithIndex (forWithIndex_) import Data.Maybe (Maybe(..), fromMaybe) import Data.Newtype (unwrap) import Data.String (joinWith) -import Data.String as String -import Data.String.Regex (replace') -import Data.String.Regex.Flags (global) -import Data.String.Regex.Unsafe (unsafeRegex) import Effect (Effect) import Effect.Console (error) import Effect.Timer (setTimeout) import Effect.Uncurried (EffectFn1, EffectFn2, EffectFn3, EffectFn5, mkEffectFn1, runEffectFn1, runEffectFn2, runEffectFn3, runEffectFn5) import Foreign (renderForeignError) +import Foreign.Generic (encodeJSON) import Foreign.Object as Object import JQuery as JQuery import JQuery.Extras as JQueryExtras @@ -146,21 +143,18 @@ compile bc@(BackendConfig backend) = do if showJs then do hideLoadingMessage displayPlainText js - else runContT (runExceptT backend.getBundle) \bundleResult -> do + else runContT (backend.resolve js) \sources -> do hideLoadingMessage - case bundleResult of - Left err -> error ("Unable to retrieve JS bundle: " <> err) - Right bundle -> do - for_ warnings \warnings_ -> do - let toAnnotation (CompileWarning{ errorCode, position, message }) = - position <#> \(ErrorPosition pos) -> - { row: pos.startLine - 1 - , column: pos.startColumn - 1 - , type: "warning" - , text: message - } - runEffectFn1 setAnnotations (mapMaybe toAnnotation warnings_) - execute (JS js) bundle bc + for_ warnings \warnings_ -> do + let toAnnotation (CompileWarning{ errorCode, position, message }) = + position <#> \(ErrorPosition pos) -> + { row: pos.startLine - 1 + , column: pos.startColumn - 1 + , type: "warning" + , text: message + } + runEffectFn1 setAnnotations (mapMaybe toAnnotation warnings_) + execute (JS js) sources bc Right (CompileFailed (FailedResult { error })) -> do hideLoadingMessage case error of @@ -191,8 +185,8 @@ compile bc@(BackendConfig backend) = do traverse_ (error <<< renderForeignError) errs -- | Execute the compiled code in a new iframe. -execute :: JS -> JS -> BackendConfig -> Effect Unit -execute js bundle bc@(BackendConfig backend) = do +execute :: JS -> Object.Object String -> BackendConfig -> Effect Unit +execute js sources bc@(BackendConfig backend) = do let html = joinWith "\n" [ """""" , """""" @@ -201,6 +195,7 @@ execute js bundle bc@(BackendConfig backend) = do , """ """ , """ """ , """ Try PureScript!""" + , """ """ , """ """ , backend.extra_styling , """ """ @@ -210,19 +205,13 @@ execute js bundle bc@(BackendConfig backend) = do , """""" ] - replaced = replace' (unsafeRegex """require\("[^"]*"\)""" global) (\s _ -> - "PS['" <> String.drop 12 (String.take (String.length s - 11) s) <> "']") (unwrap js) + json = encodeJSON (Object.insert "" (unwrap js) sources) - wrapped = joinWith "\n" - [ "var module = {};" - , "(function(module) {" - , replaced - , "})(module);" - , "module.exports.main && module.exports.main();" + scripts = joinWith "\n" + [ "var load = PSLoader(" <> json <> ");" + , """load("").main();""" ] - scripts = joinWith "\n" [unwrap bundle, wrapped] - column2 <- JQuery.select "#column2" runEffectFn3 setupIFrame column2 html scripts diff --git a/src/Try/API.js b/src/Try/API.js index a00c83f8..77024739 100644 --- a/src/Try/API.js +++ b/src/Try/API.js @@ -1,5 +1,7 @@ "use strict"; +exports.resolver_ = PSResolver; + exports.get_ = function(uri, done, fail) { $.get(uri).done(done).fail(function(err) { fail(err.statusText); diff --git a/src/Try/API.purs b/src/Try/API.purs index 16665187..dd238e5d 100644 --- a/src/Try/API.purs +++ b/src/Try/API.purs @@ -34,6 +34,7 @@ import Foreign (Foreign, ForeignError) import Foreign.Class (class Decode, decode) import Foreign.Generic (defaultOptions, genericDecode) import Foreign.Generic.Types (Options, SumEncoding(..)) +import Foreign.Object (Object) import Partial.Unsafe (unsafePartial) import Try.Types (JS(JS)) @@ -182,6 +183,20 @@ foreign import compile_ (EffectFn1 String Unit) Unit +foreign import resolver_ + :: String + -> String + -> (Object String -> Effect Unit) + -> Effect Unit + +resolver + :: String + -> String + -> ContT Unit Effect (Object String) +resolver output = \src -> ContT \k -> go src k + where + go = resolver_ output + -- | A wrapper for `compileApi` which uses `ContT`. compile :: String @@ -195,6 +210,8 @@ newtype BackendConfig = BackendConfig , mainGist :: String , extra_styling :: String , extra_body :: String + , resolve :: String + -> ContT Unit Effect (Object String) , compile :: String -> ExceptT String (ContT Unit Effect) (Either (NonEmptyList ForeignError) CompileResult) @@ -228,20 +245,23 @@ backendToString Flare = "flare" derive instance eqBackend :: Eq Backend derive instance ordBackend :: Ord Backend +-- TODO: Fix paths getBackendConfig :: Backend -> BackendConfig getBackendConfig Core = BackendConfig { backend: "core" , mainGist: "b57a766d417e109785540d584266fc33" , extra_styling: "" , extra_body: "" - , compile: compile "https://compile.purescript.org/try" - , getBundle: getDefaultBundle "https://compile.purescript.org/try" + , resolve: resolver "staging/core/.psci_modules/node_modules" + , compile: compile "http://localhost:8081" + , getBundle: getDefaultBundle "http://localhost:8081" } getBackendConfig Thermite = BackendConfig { backend: "thermite" , mainGist: "85383bb058471109cfef379bbb6bc11c" , extra_styling: """""" , extra_body: """
""" + , resolve: resolver "staging/thermite/.psci-modules/node_modules" , compile: compile "https://compile.purescript.org/thermite" , getBundle: getThermiteBundle "https://compile.purescript.org/thermite" } @@ -250,6 +270,7 @@ getBackendConfig Slides = BackendConfig , mainGist: "c62b5778a6a5f2bcd32dd97b294c068a" , extra_styling: """""" , extra_body: """
""" + , resolve: resolver "staging/slides/.psci-modules/node_modules" , compile: compile "https://compile.purescript.org/slides" , getBundle: getDefaultBundle "https://compile.purescript.org/slides" } @@ -261,6 +282,7 @@ getBackendConfig Mathbox = BackendConfig , """""" ] , extra_body: "" + , resolve: resolver "staging/mathbox/.psci-modules/node_modules" , compile: compile "https://compile.purescript.org/purescript-mathbox" , getBundle: getDefaultBundle "https://compile.purescript.org/purescript-mathbox" } @@ -269,6 +291,7 @@ getBackendConfig Behaviors = BackendConfig , mainGist: "ff1e87f0872d2d891e77d209d8f7706d" , extra_styling: "" , extra_body: """""" + , resolve: resolver "staging/behaviors/.psci-modules/node_modules" , compile: compile "https://compile.purescript.org/behaviors" , getBundle: getDefaultBundle "https://compile.purescript.org/behaviors" } @@ -282,6 +305,7 @@ getBackendConfig Flare = BackendConfig , """
""" , """""" ] + , resolve: resolver "staging/flare/.psci-modules/node_modules" , compile: compile "https://compile.purescript.org/flare" , getBundle: getDefaultBundle "https://compile.purescript.org/flare" } From 0d52a0317c5a80cf34642915000abf006ccaf579 Mon Sep 17 00:00:00 2001 From: Nathan Faubion Date: Sun, 11 Nov 2018 10:14:09 -0800 Subject: [PATCH 02/12] Rewrite loader in PS --- index.html | 1 - js/index.js | 1182 ++++++++++++++++++++++++++++++----------- js/ps-loader.js | 111 ---- js/ps-require-shim.js | 24 + src/Main.purs | 23 +- src/Try/API.js | 2 - src/Try/API.purs | 165 +----- src/Try/Backend.purs | 160 ++++++ src/Try/Loader.purs | 116 ++++ src/Try/Types.purs | 3 + 10 files changed, 1185 insertions(+), 602 deletions(-) delete mode 100644 js/ps-loader.js create mode 100644 js/ps-require-shim.js create mode 100644 src/Try/Backend.purs create mode 100644 src/Try/Loader.purs diff --git a/index.html b/index.html index 32e15e1e..8e97044d 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,6 @@ - diff --git a/js/index.js b/js/index.js index e797ba43..8fab0433 100644 --- a/js/index.js +++ b/js/index.js @@ -257,11 +257,21 @@ var PS = {}; var eqString = new Eq($foreign.refEq); var eqInt = new Eq($foreign.refEq); var eqChar = new Eq($foreign.refEq); + var eqBoolean = new Eq($foreign.refEq); var eq = function (dict) { return dict.eq; }; + var notEq = function (dictEq) { + return function (x) { + return function (y) { + return eq(eqBoolean)(eq(dictEq)(x)(y))(false); + }; + }; + }; exports["Eq"] = Eq; exports["eq"] = eq; + exports["notEq"] = notEq; + exports["eqBoolean"] = eqBoolean; exports["eqInt"] = eqInt; exports["eqChar"] = eqChar; exports["eqString"] = eqString; @@ -337,9 +347,24 @@ var PS = {}; EQ.value = new EQ(); return EQ; })(); + var eqOrdering = new Data_Eq.Eq(function (v) { + return function (v1) { + if (v instanceof LT && v1 instanceof LT) { + return true; + }; + if (v instanceof GT && v1 instanceof GT) { + return true; + }; + if (v instanceof EQ && v1 instanceof EQ) { + return true; + }; + return false; + }; + }); exports["LT"] = LT; exports["GT"] = GT; exports["EQ"] = EQ; + exports["eqOrdering"] = eqOrdering; })(PS["Data.Ordering"] = PS["Data.Ordering"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -451,7 +476,10 @@ var PS = {}; var Ord = function (Eq0, compare) { this.Eq0 = Eq0; this.compare = compare; - }; + }; + var ordString = new Ord(function () { + return Data_Eq.eqString; + }, Data_Ord_Unsafe.unsafeCompare); var ordInt = new Ord(function () { return Data_Eq.eqInt; }, Data_Ord_Unsafe.unsafeCompare); @@ -461,9 +489,20 @@ var PS = {}; var compare = function (dict) { return dict.compare; }; + var comparing = function (dictOrd) { + return function (f) { + return function (x) { + return function (y) { + return compare(dictOrd)(f(x))(f(y)); + }; + }; + }; + }; exports["Ord"] = Ord; exports["compare"] = compare; + exports["comparing"] = comparing; exports["ordInt"] = ordInt; + exports["ordString"] = ordString; exports["ordChar"] = ordChar; })(PS["Data.Ord"] = PS["Data.Ord"] || {}); (function(exports) { @@ -699,11 +738,17 @@ var PS = {}; var discardUnit = new Discard(function (dictBind) { return bind(dictBind); }); + var join = function (dictBind) { + return function (m) { + return bind(dictBind)(m)(Control_Category.identity(Control_Category.categoryFn)); + }; + }; exports["Bind"] = Bind; exports["bind"] = bind; exports["bindFlipped"] = bindFlipped; exports["Discard"] = Discard; exports["discard"] = discard; + exports["join"] = join; exports["composeKleisli"] = composeKleisli; exports["bindArray"] = bindArray; exports["discardUnit"] = discardUnit; @@ -734,6 +779,19 @@ var PS = {}; exports["Monad"] = Monad; exports["ap"] = ap; })(PS["Control.Monad"] = PS["Control.Monad"] || {}); +(function(exports) { + // Generated by purs version 0.12.0 + "use strict"; + var Prelude = PS["Prelude"]; + var MonadTrans = function (lift) { + this.lift = lift; + }; + var lift = function (dict) { + return dict.lift; + }; + exports["lift"] = lift; + exports["MonadTrans"] = MonadTrans; +})(PS["Control.Monad.Trans.Class"] = PS["Control.Monad.Trans.Class"] || {}); (function(exports) { "use strict"; @@ -1050,7 +1108,14 @@ var PS = {}; return function (k) { return v(k); }; - }; + }; + var monadTransContT = new Control_Monad_Trans_Class.MonadTrans(function (dictMonad) { + return function (m) { + return function (k) { + return Control_Bind.bind(dictMonad.Bind1())(m)(k); + }; + }; + }); var functorContT = function (dictFunctor) { return new Data_Functor.Functor(function (f) { return function (v) { @@ -1107,12 +1172,21 @@ var PS = {}; return bindContT(dictMonad.Bind1()); }); }; + var monadEffectContT = function (dictMonadEffect) { + return new Effect_Class.MonadEffect(function () { + return monadContT(dictMonadEffect.Monad0()); + }, function ($46) { + return Control_Monad_Trans_Class.lift(monadTransContT)(dictMonadEffect.Monad0())(Effect_Class.liftEffect(dictMonadEffect)($46)); + }); + }; exports["runContT"] = runContT; exports["functorContT"] = functorContT; exports["applyContT"] = applyContT; exports["applicativeContT"] = applicativeContT; exports["bindContT"] = bindContT; exports["monadContT"] = monadContT; + exports["monadTransContT"] = monadTransContT; + exports["monadEffectContT"] = monadEffectContT; })(PS["Control.Monad.Cont.Trans"] = PS["Control.Monad.Cont.Trans"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -1258,6 +1332,32 @@ var PS = {}; })()); }; }; + var applyMaybe = new Control_Apply.Apply(function () { + return functorMaybe; + }, function (v) { + return function (v1) { + if (v instanceof Just) { + return Data_Functor.map(functorMaybe)(v.value0)(v1); + }; + if (v instanceof Nothing) { + return Nothing.value; + }; + throw new Error("Failed pattern match at Data.Maybe line 67, column 1 - line 67, column 35: " + [ v.constructor.name, v1.constructor.name ]); + }; + }); + var bindMaybe = new Control_Bind.Bind(function () { + return applyMaybe; + }, function (v) { + return function (v1) { + if (v instanceof Just) { + return v1(v.value0); + }; + if (v instanceof Nothing) { + return Nothing.value; + }; + throw new Error("Failed pattern match at Data.Maybe line 126, column 1 - line 126, column 33: " + [ v.constructor.name, v1.constructor.name ]); + }; + }); exports["Nothing"] = Nothing; exports["Just"] = Just; exports["maybe"] = maybe; @@ -1265,6 +1365,8 @@ var PS = {}; exports["isNothing"] = isNothing; exports["fromJust"] = fromJust; exports["functorMaybe"] = functorMaybe; + exports["applyMaybe"] = applyMaybe; + exports["bindMaybe"] = bindMaybe; })(PS["Data.Maybe"] = PS["Data.Maybe"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -1776,6 +1878,43 @@ var PS = {}; })()); }; }; + var foldableEither = new Data_Foldable.Foldable(function (dictMonoid) { + return function (f) { + return function (v) { + if (v instanceof Left) { + return Data_Monoid.mempty(dictMonoid); + }; + if (v instanceof Right) { + return f(v.value0); + }; + throw new Error("Failed pattern match at Data.Either line 187, column 1 - line 187, column 47: " + [ f.constructor.name, v.constructor.name ]); + }; + }; + }, function (v) { + return function (z) { + return function (v1) { + if (v1 instanceof Left) { + return z; + }; + if (v1 instanceof Right) { + return v(z)(v1.value0); + }; + throw new Error("Failed pattern match at Data.Either line 187, column 1 - line 187, column 47: " + [ v.constructor.name, z.constructor.name, v1.constructor.name ]); + }; + }; + }, function (v) { + return function (z) { + return function (v1) { + if (v1 instanceof Left) { + return z; + }; + if (v1 instanceof Right) { + return v(v1.value0)(z); + }; + throw new Error("Failed pattern match at Data.Either line 187, column 1 - line 187, column 47: " + [ v.constructor.name, z.constructor.name, v1.constructor.name ]); + }; + }; + }); var either = function (v) { return function (v1) { return function (v2) { @@ -1826,6 +1965,7 @@ var PS = {}; exports["bifunctorEither"] = bifunctorEither; exports["applyEither"] = applyEither; exports["applicativeEither"] = applicativeEither; + exports["foldableEither"] = foldableEither; })(PS["Data.Either"] = PS["Data.Either"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -1951,7 +2091,14 @@ var PS = {}; }; var runExceptT = function (v) { return v; - }; + }; + var monadTransExceptT = new Control_Monad_Trans_Class.MonadTrans(function (dictMonad) { + return function (m) { + return Control_Bind.bind(dictMonad.Bind1())(m)(function (v) { + return Control_Applicative.pure(dictMonad.Applicative0())(new Data_Either.Right(v)); + }); + }; + }); var mapExceptT = function (f) { return function (v) { return f(v); @@ -1995,6 +2142,13 @@ var PS = {}; return ExceptT(Control_Applicative.pure(dictMonad.Applicative0())(Data_Either.Right.create($98))); }); }; + var monadEffectExceptT = function (dictMonadEffect) { + return new Effect_Class.MonadEffect(function () { + return monadExceptT(dictMonadEffect.Monad0()); + }, function ($99) { + return Control_Monad_Trans_Class.lift(monadTransExceptT)(dictMonadEffect.Monad0())(Effect_Class.liftEffect(dictMonadEffect)($99)); + }); + }; var monadThrowExceptT = function (dictMonad) { return new Control_Monad_Error_Class.MonadThrow(function () { return monadExceptT(dictMonad); @@ -2038,6 +2192,8 @@ var PS = {}; exports["bindExceptT"] = bindExceptT; exports["monadExceptT"] = monadExceptT; exports["altExceptT"] = altExceptT; + exports["monadTransExceptT"] = monadTransExceptT; + exports["monadEffectExceptT"] = monadEffectExceptT; exports["monadThrowExceptT"] = monadThrowExceptT; })(PS["Control.Monad.Except.Trans"] = PS["Control.Monad.Except.Trans"] || {}); (function(exports) { @@ -2161,6 +2317,16 @@ var PS = {}; }; }; }; + + exports.foreach = function (as) { + return function (f) { + return function () { + for (var i = 0, l = as.length; i < l; i++) { + f(as[i])(); + } + }; + }; + }; })(PS["Control.Monad.ST.Internal"] = PS["Control.Monad.ST.Internal"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -2195,7 +2361,23 @@ var PS = {}; exports["applicativeST"] = applicativeST; exports["bindST"] = bindST; exports["monadST"] = monadST; + exports["foreach"] = $foreign.foreach; })(PS["Control.Monad.ST.Internal"] = PS["Control.Monad.ST.Internal"] || {}); +(function(exports) { + "use strict"; + + // module Unsafe.Coerce + + exports.unsafeCoerce = function (x) { + return x; + }; +})(PS["Unsafe.Coerce"] = PS["Unsafe.Coerce"] || {}); +(function(exports) { + // Generated by purs version 0.12.0 + "use strict"; + var $foreign = PS["Unsafe.Coerce"]; + exports["unsafeCoerce"] = $foreign.unsafeCoerce; +})(PS["Unsafe.Coerce"] = PS["Unsafe.Coerce"] || {}); (function(exports) { // Generated by purs version 0.12.0 "use strict"; @@ -2325,6 +2507,16 @@ var PS = {}; }; }; + exports["modify'"] = function (f) { + return function (ref) { + return function () { + var t = f(ref.value); + ref.value = t.state; + return t.value; + }; + }; + }; + exports.write = function (val) { return function (ref) { return function () { @@ -2341,7 +2533,23 @@ var PS = {}; var Data_Function = PS["Data.Function"]; var Data_Functor = PS["Data.Functor"]; var Effect = PS["Effect"]; - var Prelude = PS["Prelude"]; + var Prelude = PS["Prelude"]; + var modify = function (f) { + return $foreign["modify'"](function (s) { + var s$prime = f(s); + return { + state: s$prime, + value: s$prime + }; + }); + }; + var modify_ = function (f) { + return function (s) { + return Data_Functor["void"](Effect.functorEffect)(modify(f)(s)); + }; + }; + exports["modify"] = modify; + exports["modify_"] = modify_; exports["new"] = $foreign["new"]; exports["read"] = $foreign.read; exports["write"] = $foreign.write; @@ -2551,6 +2759,44 @@ var PS = {}; return xs.length; }; + //------------------------------------------------------------------------------ + // Indexed operations ---------------------------------------------------------- + //------------------------------------------------------------------------------ + + exports.indexImpl = function (just) { + return function (nothing) { + return function (xs) { + return function (i) { + return i < 0 || i >= xs.length ? nothing : just(xs[i]); + }; + }; + }; + }; + + //------------------------------------------------------------------------------ + // Sorting --------------------------------------------------------------------- + //------------------------------------------------------------------------------ + + exports.sortImpl = function (f) { + return function (l) { + return l.slice().sort(function (x, y) { + return f(x)(y); + }); + }; + }; + + //------------------------------------------------------------------------------ + // Subarrays ------------------------------------------------------------------- + //------------------------------------------------------------------------------ + + exports.slice = function (s) { + return function (e) { + return function (l) { + return l.slice(s, e); + }; + }; + }; + //------------------------------------------------------------------------------ // Zipping --------------------------------------------------------------------- //------------------------------------------------------------------------------ @@ -2568,6 +2814,45 @@ var PS = {}; }; }; })(PS["Data.Array"] = PS["Data.Array"] || {}); +(function(exports) { + "use strict"; + + exports.pushAll = function (as) { + return function (xs) { + return function () { + return xs.push.apply(xs, as); + }; + }; + }; +})(PS["Data.Array.ST"] = PS["Data.Array.ST"] || {}); +(function(exports) { + // Generated by purs version 0.12.0 + "use strict"; + var $foreign = PS["Data.Array.ST"]; + var Control_Applicative = PS["Control.Applicative"]; + var Control_Bind = PS["Control.Bind"]; + var Control_Monad_ST = PS["Control.Monad.ST"]; + var Control_Monad_ST_Internal = PS["Control.Monad.ST.Internal"]; + var Control_Semigroupoid = PS["Control.Semigroupoid"]; + var Data_Maybe = PS["Data.Maybe"]; + var Data_Ord = PS["Data.Ord"]; + var Data_Ordering = PS["Data.Ordering"]; + var Data_Ring = PS["Data.Ring"]; + var Prelude = PS["Prelude"]; + var Unsafe_Coerce = PS["Unsafe.Coerce"]; + var unsafeThaw = function ($11) { + return Control_Applicative.pure(Control_Monad_ST_Internal.applicativeST)($11); + }; + var unsafeFreeze = function ($12) { + return Control_Applicative.pure(Control_Monad_ST_Internal.applicativeST)($12); + }; + var push = function (a) { + return $foreign.pushAll([ a ]); + }; + exports["push"] = push; + exports["unsafeFreeze"] = unsafeFreeze; + exports["unsafeThaw"] = unsafeThaw; +})(PS["Data.Array.ST"] = PS["Data.Array.ST"] || {}); (function(exports) { "use strict"; @@ -2708,9 +2993,76 @@ var PS = {}; var Partial_Unsafe = PS["Partial.Unsafe"]; var Prelude = PS["Prelude"]; var Unsafe_Coerce = PS["Unsafe.Coerce"]; + var sortBy = function (comp) { + return function (xs) { + var comp$prime = function (x) { + return function (y) { + var v = comp(x)(y); + if (v instanceof Data_Ordering.GT) { + return 1; + }; + if (v instanceof Data_Ordering.EQ) { + return 0; + }; + if (v instanceof Data_Ordering.LT) { + return -1 | 0; + }; + throw new Error("Failed pattern match at Data.Array line 702, column 15 - line 707, column 1: " + [ v.constructor.name ]); + }; + }; + return $foreign.sortImpl(comp$prime)(xs); + }; + }; + var sortWith = function (dictOrd) { + return function (f) { + return sortBy(Data_Ord.comparing(dictOrd)(f)); + }; + }; var singleton = function (a) { return [ a ]; }; + var mapWithIndex = function (f) { + return function (xs) { + return $foreign.zipWith(f)($foreign.range(0)($foreign.length(xs) - 1 | 0))(xs); + }; + }; + var index = $foreign.indexImpl(Data_Maybe.Just.create)(Data_Maybe.Nothing.value); + var last = function (xs) { + return index(xs)($foreign.length(xs) - 1 | 0); + }; + var head = function (xs) { + return index(xs)(0); + }; + var nubBy = function (comp) { + return function (xs) { + var indexedAndSorted = sortBy(function (x) { + return function (y) { + return comp(Data_Tuple.snd(x))(Data_Tuple.snd(y)); + }; + })(mapWithIndex(Data_Tuple.Tuple.create)(xs)); + var v = head(indexedAndSorted); + if (v instanceof Data_Maybe.Nothing) { + return [ ]; + }; + if (v instanceof Data_Maybe.Just) { + return Data_Functor.map(Data_Functor.functorArray)(Data_Tuple.snd)(sortWith(Data_Ord.ordInt)(Data_Tuple.fst)((function __do() { + var v1 = Data_Array_ST.unsafeThaw(singleton(v.value0))(); + Control_Monad_ST_Internal.foreach(indexedAndSorted)(function (v2) { + return function __do() { + var v3 = Data_Functor.map(Control_Monad_ST_Internal.functorST)(function ($111) { + return Data_Tuple.snd((function ($112) { + return Data_Maybe.fromJust()(last($112)); + })($111)); + })(Data_Array_ST.unsafeFreeze(v1))(); + return Control_Applicative.when(Control_Monad_ST_Internal.applicativeST)(Data_Eq.notEq(Data_Ordering.eqOrdering)(comp(v3)(v2.value1))(Data_Ordering.EQ.value))(Data_Functor["void"](Control_Monad_ST_Internal.functorST)(Data_Array_ST.push(v2)(v1)))(); + }; + })(); + return Data_Array_ST.unsafeFreeze(v1)(); + })())); + }; + throw new Error("Failed pattern match at Data.Array line 903, column 17 - line 911, column 29: " + [ v.constructor.name ]); + }; + }; var fromFoldable = function (dictFoldable) { return $foreign.fromFoldableImpl(Data_Foldable.foldr(dictFoldable)); }; @@ -2723,65 +3075,190 @@ var PS = {}; var catMaybes = mapMaybe(Control_Category.identity(Control_Category.categoryFn)); exports["fromFoldable"] = fromFoldable; exports["singleton"] = singleton; + exports["head"] = head; + exports["last"] = last; + exports["index"] = index; exports["concatMap"] = concatMap; exports["mapMaybe"] = mapMaybe; exports["catMaybes"] = catMaybes; + exports["mapWithIndex"] = mapWithIndex; + exports["sortBy"] = sortBy; + exports["sortWith"] = sortWith; + exports["nubBy"] = nubBy; exports["range"] = $foreign.range; exports["length"] = $foreign.length; exports["zipWith"] = $foreign.zipWith; })(PS["Data.Array"] = PS["Data.Array"] || {}); -(function(exports) { - "use strict"; - - exports.toCharCode = function (c) { - return c.charCodeAt(0); - }; - - exports.fromCharCode = function (c) { - return String.fromCharCode(c); - }; -})(PS["Data.Enum"] = PS["Data.Enum"] || {}); (function(exports) { // Generated by purs version 0.12.0 "use strict"; - var $foreign = PS["Data.Enum"]; + var Control_Alt = PS["Control.Alt"]; + var Control_Alternative = PS["Control.Alternative"]; + var Control_Applicative = PS["Control.Applicative"]; var Control_Apply = PS["Control.Apply"]; - var Control_Bind = PS["Control.Bind"]; - var Control_MonadPlus = PS["Control.MonadPlus"]; - var Control_MonadZero = PS["Control.MonadZero"]; + var Control_Category = PS["Control.Category"]; + var Control_Plus = PS["Control.Plus"]; var Control_Semigroupoid = PS["Control.Semigroupoid"]; - var Data_Boolean = PS["Data.Boolean"]; - var Data_Bounded = PS["Data.Bounded"]; - var Data_Either = PS["Data.Either"]; var Data_Eq = PS["Data.Eq"]; + var Data_Foldable = PS["Data.Foldable"]; + var Data_FoldableWithIndex = PS["Data.FoldableWithIndex"]; var Data_Function = PS["Data.Function"]; var Data_Functor = PS["Data.Functor"]; + var Data_FunctorWithIndex = PS["Data.FunctorWithIndex"]; var Data_HeytingAlgebra = PS["Data.HeytingAlgebra"]; var Data_Maybe = PS["Data.Maybe"]; - var Data_Newtype = PS["Data.Newtype"]; var Data_Ord = PS["Data.Ord"]; var Data_Ordering = PS["Data.Ordering"]; - var Data_Ring = PS["Data.Ring"]; var Data_Semigroup = PS["Data.Semigroup"]; - var Data_Semiring = PS["Data.Semiring"]; + var Data_Semigroup_Foldable = PS["Data.Semigroup.Foldable"]; var Data_Show = PS["Data.Show"]; + var Data_Traversable = PS["Data.Traversable"]; + var Data_TraversableWithIndex = PS["Data.TraversableWithIndex"]; var Data_Tuple = PS["Data.Tuple"]; var Data_Unfoldable = PS["Data.Unfoldable"]; var Data_Unfoldable1 = PS["Data.Unfoldable1"]; - var Data_Unit = PS["Data.Unit"]; - var Partial_Unsafe = PS["Partial.Unsafe"]; - var Prelude = PS["Prelude"]; - var Enum = function (Ord0, pred, succ) { - this.Ord0 = Ord0; - this.pred = pred; - this.succ = succ; - }; - var BoundedEnum = function (Bounded0, Enum1, cardinality, fromEnum, toEnum) { - this.Bounded0 = Bounded0; - this.Enum1 = Enum1; - this.cardinality = cardinality; - this.fromEnum = fromEnum; - this.toEnum = toEnum; + var Prelude = PS["Prelude"]; + var NonEmpty = (function () { + function NonEmpty(value0, value1) { + this.value0 = value0; + this.value1 = value1; + }; + NonEmpty.create = function (value0) { + return function (value1) { + return new NonEmpty(value0, value1); + }; + }; + return NonEmpty; + })(); + var singleton = function (dictPlus) { + return function (a) { + return new NonEmpty(a, Control_Plus.empty(dictPlus)); + }; + }; + var functorNonEmpty = function (dictFunctor) { + return new Data_Functor.Functor(function (f) { + return function (m) { + return new NonEmpty(f(m.value0), Data_Functor.map(dictFunctor)(f)(m.value1)); + }; + }); + }; + var foldableNonEmpty = function (dictFoldable) { + return new Data_Foldable.Foldable(function (dictMonoid) { + return function (f) { + return function (v) { + return Data_Semigroup.append(dictMonoid.Semigroup0())(f(v.value0))(Data_Foldable.foldMap(dictFoldable)(dictMonoid)(f)(v.value1)); + }; + }; + }, function (f) { + return function (b) { + return function (v) { + return Data_Foldable.foldl(dictFoldable)(f)(f(b)(v.value0))(v.value1); + }; + }; + }, function (f) { + return function (b) { + return function (v) { + return f(v.value0)(Data_Foldable.foldr(dictFoldable)(f)(b)(v.value1)); + }; + }; + }); + }; + exports["NonEmpty"] = NonEmpty; + exports["singleton"] = singleton; + exports["functorNonEmpty"] = functorNonEmpty; + exports["foldableNonEmpty"] = foldableNonEmpty; +})(PS["Data.NonEmpty"] = PS["Data.NonEmpty"] || {}); +(function(exports) { + // Generated by purs version 0.12.0 + "use strict"; + var Control_Alternative = PS["Control.Alternative"]; + var Control_Bind = PS["Control.Bind"]; + var Control_Lazy = PS["Control.Lazy"]; + var Control_Monad_Rec_Class = PS["Control.Monad.Rec.Class"]; + var Control_Semigroupoid = PS["Control.Semigroupoid"]; + var Data_Array = PS["Data.Array"]; + var Data_Array_NonEmpty_Internal = PS["Data.Array.NonEmpty.Internal"]; + var Data_Bifunctor = PS["Data.Bifunctor"]; + var Data_Boolean = PS["Data.Boolean"]; + var Data_Eq = PS["Data.Eq"]; + var Data_Foldable = PS["Data.Foldable"]; + var Data_Function = PS["Data.Function"]; + var Data_Functor = PS["Data.Functor"]; + var Data_Maybe = PS["Data.Maybe"]; + var Data_NonEmpty = PS["Data.NonEmpty"]; + var Data_Ord = PS["Data.Ord"]; + var Data_Ring = PS["Data.Ring"]; + var Data_Semigroup = PS["Data.Semigroup"]; + var Data_Semigroup_Foldable = PS["Data.Semigroup.Foldable"]; + var Data_Semiring = PS["Data.Semiring"]; + var Data_Tuple = PS["Data.Tuple"]; + var Data_Unfoldable = PS["Data.Unfoldable"]; + var Data_Unfoldable1 = PS["Data.Unfoldable1"]; + var Partial_Unsafe = PS["Partial.Unsafe"]; + var Prelude = PS["Prelude"]; + var Unsafe_Coerce = PS["Unsafe.Coerce"]; + var toArray = Unsafe_Coerce.unsafeCoerce; + var adaptAny = function (f) { + return function ($54) { + return f(toArray($54)); + }; + }; + var index = adaptAny(Data_Array.index); + exports["toArray"] = toArray; + exports["index"] = index; +})(PS["Data.Array.NonEmpty"] = PS["Data.Array.NonEmpty"] || {}); +(function(exports) { + "use strict"; + + exports.toCharCode = function (c) { + return c.charCodeAt(0); + }; + + exports.fromCharCode = function (c) { + return String.fromCharCode(c); + }; +})(PS["Data.Enum"] = PS["Data.Enum"] || {}); +(function(exports) { + // Generated by purs version 0.12.0 + "use strict"; + var $foreign = PS["Data.Enum"]; + var Control_Apply = PS["Control.Apply"]; + var Control_Bind = PS["Control.Bind"]; + var Control_MonadPlus = PS["Control.MonadPlus"]; + var Control_MonadZero = PS["Control.MonadZero"]; + var Control_Semigroupoid = PS["Control.Semigroupoid"]; + var Data_Boolean = PS["Data.Boolean"]; + var Data_Bounded = PS["Data.Bounded"]; + var Data_Either = PS["Data.Either"]; + var Data_Eq = PS["Data.Eq"]; + var Data_Function = PS["Data.Function"]; + var Data_Functor = PS["Data.Functor"]; + var Data_HeytingAlgebra = PS["Data.HeytingAlgebra"]; + var Data_Maybe = PS["Data.Maybe"]; + var Data_Newtype = PS["Data.Newtype"]; + var Data_Ord = PS["Data.Ord"]; + var Data_Ordering = PS["Data.Ordering"]; + var Data_Ring = PS["Data.Ring"]; + var Data_Semigroup = PS["Data.Semigroup"]; + var Data_Semiring = PS["Data.Semiring"]; + var Data_Show = PS["Data.Show"]; + var Data_Tuple = PS["Data.Tuple"]; + var Data_Unfoldable = PS["Data.Unfoldable"]; + var Data_Unfoldable1 = PS["Data.Unfoldable1"]; + var Data_Unit = PS["Data.Unit"]; + var Partial_Unsafe = PS["Partial.Unsafe"]; + var Prelude = PS["Prelude"]; + var Enum = function (Ord0, pred, succ) { + this.Ord0 = Ord0; + this.pred = pred; + this.succ = succ; + }; + var BoundedEnum = function (Bounded0, Enum1, cardinality, fromEnum, toEnum) { + this.Bounded0 = Bounded0; + this.Enum1 = Enum1; + this.cardinality = cardinality; + this.fromEnum = fromEnum; + this.toEnum = toEnum; }; var toEnum = function (dict) { return dict.toEnum; @@ -3020,85 +3497,6 @@ var PS = {}; exports["toNumber"] = $foreign.toNumber; exports["toStringAs"] = $foreign.toStringAs; })(PS["Data.Int"] = PS["Data.Int"] || {}); -(function(exports) { - // Generated by purs version 0.12.0 - "use strict"; - var Control_Alt = PS["Control.Alt"]; - var Control_Alternative = PS["Control.Alternative"]; - var Control_Applicative = PS["Control.Applicative"]; - var Control_Apply = PS["Control.Apply"]; - var Control_Category = PS["Control.Category"]; - var Control_Plus = PS["Control.Plus"]; - var Control_Semigroupoid = PS["Control.Semigroupoid"]; - var Data_Eq = PS["Data.Eq"]; - var Data_Foldable = PS["Data.Foldable"]; - var Data_FoldableWithIndex = PS["Data.FoldableWithIndex"]; - var Data_Function = PS["Data.Function"]; - var Data_Functor = PS["Data.Functor"]; - var Data_FunctorWithIndex = PS["Data.FunctorWithIndex"]; - var Data_HeytingAlgebra = PS["Data.HeytingAlgebra"]; - var Data_Maybe = PS["Data.Maybe"]; - var Data_Ord = PS["Data.Ord"]; - var Data_Ordering = PS["Data.Ordering"]; - var Data_Semigroup = PS["Data.Semigroup"]; - var Data_Semigroup_Foldable = PS["Data.Semigroup.Foldable"]; - var Data_Show = PS["Data.Show"]; - var Data_Traversable = PS["Data.Traversable"]; - var Data_TraversableWithIndex = PS["Data.TraversableWithIndex"]; - var Data_Tuple = PS["Data.Tuple"]; - var Data_Unfoldable = PS["Data.Unfoldable"]; - var Data_Unfoldable1 = PS["Data.Unfoldable1"]; - var Prelude = PS["Prelude"]; - var NonEmpty = (function () { - function NonEmpty(value0, value1) { - this.value0 = value0; - this.value1 = value1; - }; - NonEmpty.create = function (value0) { - return function (value1) { - return new NonEmpty(value0, value1); - }; - }; - return NonEmpty; - })(); - var singleton = function (dictPlus) { - return function (a) { - return new NonEmpty(a, Control_Plus.empty(dictPlus)); - }; - }; - var functorNonEmpty = function (dictFunctor) { - return new Data_Functor.Functor(function (f) { - return function (m) { - return new NonEmpty(f(m.value0), Data_Functor.map(dictFunctor)(f)(m.value1)); - }; - }); - }; - var foldableNonEmpty = function (dictFoldable) { - return new Data_Foldable.Foldable(function (dictMonoid) { - return function (f) { - return function (v) { - return Data_Semigroup.append(dictMonoid.Semigroup0())(f(v.value0))(Data_Foldable.foldMap(dictFoldable)(dictMonoid)(f)(v.value1)); - }; - }; - }, function (f) { - return function (b) { - return function (v) { - return Data_Foldable.foldl(dictFoldable)(f)(f(b)(v.value0))(v.value1); - }; - }; - }, function (f) { - return function (b) { - return function (v) { - return f(v.value0)(Data_Foldable.foldr(dictFoldable)(f)(b)(v.value1)); - }; - }; - }); - }; - exports["NonEmpty"] = NonEmpty; - exports["singleton"] = singleton; - exports["functorNonEmpty"] = functorNonEmpty; - exports["foldableNonEmpty"] = foldableNonEmpty; -})(PS["Data.NonEmpty"] = PS["Data.NonEmpty"] || {}); (function(exports) { // Generated by purs version 0.12.0 "use strict"; @@ -3664,6 +4062,24 @@ var PS = {}; }; }; + exports._match = function (just) { + return function (nothing) { + return function (r) { + return function (s) { + var m = s.match(r); + if (m == null || m.length === 0) { + return nothing; + } else { + for (var i = 0; i < m.length; i++) { + m[i] = m[i] == null ? nothing : just(m[i]); + } + return just(m); + } + }; + }; + }; + }; + exports.replace = function (r) { return function (s1) { return function (s2) { @@ -3695,6 +4111,13 @@ var PS = {}; }; return RegexFlags; })(); + var noFlags = new RegexFlags({ + global: false, + ignoreCase: false, + multiline: false, + sticky: false, + unicode: false + }); var global = new RegexFlags({ global: true, ignoreCase: false, @@ -3703,6 +4126,7 @@ var PS = {}; unicode: false }); exports["RegexFlags"] = RegexFlags; + exports["noFlags"] = noFlags; exports["global"] = global; })(PS["Data.String.Regex.Flags"] = PS["Data.String.Regex.Flags"] || {}); (function(exports) { @@ -3754,8 +4178,10 @@ var PS = {}; return $foreign["regex'"](Data_Either.Left.create)(Data_Either.Right.create)(s)(renderFlags(f)); }; }; + var match = $foreign._match(Data_Maybe.Just.create)(Data_Maybe.Nothing.value); exports["regex"] = regex; exports["renderFlags"] = renderFlags; + exports["match"] = match; exports["replace"] = $foreign.replace; })(PS["Data.String.Regex"] = PS["Data.String.Regex"] || {}); (function(exports) { @@ -3843,6 +4269,20 @@ var PS = {}; var Prelude = PS["Prelude"]; exports["setTimeout"] = $foreign.setTimeout; })(PS["Effect.Timer"] = PS["Effect.Timer"] || {}); +(function(exports) { + "use strict"; + + exports.unsafePerformEffect = function (f) { + return f(); + }; +})(PS["Effect.Unsafe"] = PS["Effect.Unsafe"] || {}); +(function(exports) { + // Generated by purs version 0.12.0 + "use strict"; + var $foreign = PS["Effect.Unsafe"]; + var Effect = PS["Effect"]; + exports["unsafePerformEffect"] = $foreign.unsafePerformEffect; +})(PS["Effect.Unsafe"] = PS["Effect.Unsafe"] || {}); (function(exports) { "use strict"; @@ -4041,7 +4481,9 @@ var PS = {}; } return r; }; - }; + }; + + exports.empty = {}; exports.runST = function (f) { return f(); @@ -4233,6 +4675,7 @@ var PS = {}; exports["foldM"] = foldM; exports["thawST"] = thawST; exports["semigroupObject"] = semigroupObject; + exports["empty"] = $foreign.empty; })(PS["Foreign.Object"] = PS["Foreign.Object"] || {}); (function(exports) { // Generated by purs version 0.12.0 @@ -4996,8 +5439,6 @@ var PS = {}; (function(exports) { "use strict"; - exports.resolver_ = PSResolver; - exports.get_ = function(uri, done, fail) { $.get(uri).done(done).fail(function(err) { fail(err.statusText); @@ -5020,19 +5461,6 @@ var PS = {}; }); } })(PS["Try.API"] = PS["Try.API"] || {}); -(function(exports) { - // Generated by purs version 0.12.0 - "use strict"; - var Data_Newtype = PS["Data.Newtype"]; - var JS = function (x) { - return x; - }; - var newtypeJS = new Data_Newtype.Newtype(function (n) { - return n; - }, JS); - exports["JS"] = JS; - exports["newtypeJS"] = newtypeJS; -})(PS["Try.Types"] = PS["Try.Types"] || {}); (function(exports) { "use strict"; var $foreign = PS["Try.API"]; @@ -5041,41 +5469,23 @@ var PS = {}; var Control_Monad_Cont_Trans = PS["Control.Monad.Cont.Trans"]; var Control_Monad_Except = PS["Control.Monad.Except"]; var Control_Monad_Except_Trans = PS["Control.Monad.Except.Trans"]; - var Control_Parallel = PS["Control.Parallel"]; - var Control_Parallel_Class = PS["Control.Parallel.Class"]; var Control_Semigroupoid = PS["Control.Semigroupoid"]; - var Data_Array = PS["Data.Array"]; var Data_Either = PS["Data.Either"]; - var Data_Eq = PS["Data.Eq"]; - var Data_Foldable = PS["Data.Foldable"]; - var Data_Function = PS["Data.Function"]; var Data_Functor = PS["Data.Functor"]; var Data_Generic_Rep = PS["Data.Generic.Rep"]; var Data_Identity = PS["Data.Identity"]; var Data_List_NonEmpty = PS["Data.List.NonEmpty"]; var Data_List_Types = PS["Data.List.Types"]; var Data_Maybe = PS["Data.Maybe"]; - var Data_Monoid = PS["Data.Monoid"]; - var Data_Ord = PS["Data.Ord"]; - var Data_Ordering = PS["Data.Ordering"]; - var Data_Semigroup = PS["Data.Semigroup"]; - var Data_String_Regex = PS["Data.String.Regex"]; - var Data_String_Regex_Flags = PS["Data.String.Regex.Flags"]; - var Data_String_Regex_Unsafe = PS["Data.String.Regex.Unsafe"]; var Data_Symbol = PS["Data.Symbol"]; - var Data_Traversable = PS["Data.Traversable"]; var Effect = PS["Effect"]; - var Effect_Class = PS["Effect.Class"]; var Effect_Uncurried = PS["Effect.Uncurried"]; var Foreign = PS["Foreign"]; var Foreign_Class = PS["Foreign.Class"]; var Foreign_Generic = PS["Foreign.Generic"]; var Foreign_Generic_Class = PS["Foreign.Generic.Class"]; var Foreign_Generic_Types = PS["Foreign.Generic.Types"]; - var Foreign_Object = PS["Foreign.Object"]; - var Partial_Unsafe = PS["Partial.Unsafe"]; var Prelude = PS["Prelude"]; - var Try_Types = PS["Try.Types"]; // | An error reported from the compile API. var CompilerErrors = (function () { @@ -5120,96 +5530,19 @@ var PS = {}; }; return CompileFailed; })(); - var Core = (function () { - function Core() { - - }; - Core.value = new Core(); - return Core; - })(); - var Thermite = (function () { - function Thermite() { - - }; - Thermite.value = new Thermite(); - return Thermite; - })(); - var Slides = (function () { - function Slides() { - - }; - Slides.value = new Slides(); - return Slides; - })(); - var Mathbox = (function () { - function Mathbox() { - - }; - Mathbox.value = new Mathbox(); - return Mathbox; - })(); - var Behaviors = (function () { - function Behaviors() { - - }; - Behaviors.value = new Behaviors(); - return Behaviors; - })(); - var Flare = (function () { - function Flare() { - - }; - Flare.value = new Flare(); - return Flare; - })(); - var resolver = function (output) { - var go = $foreign.resolver_(output); - return function (src) { - return function (k) { - return go(src)(k); - }; - }; - }; // | A wrapper for `get` which uses `ContT`. var get = function (uri) { return function (k) { return function () { - return $foreign.get_(uri, function ($65) { - return k(Data_Either.Right.create($65))(); - }, function ($66) { - return k(Data_Either.Left.create($66))(); + return $foreign.get_(uri, function ($35) { + return k(Data_Either.Right.create($35))(); + }, function ($36) { + return k(Data_Either.Left.create($36))(); }); }; }; }; - - // | Get the default bundle - var getDefaultBundle = function (endpoint) { - return Data_Functor.map(Control_Monad_Except_Trans.functorExceptT(Control_Monad_Cont_Trans.functorContT(Effect.functorEffect)))(Try_Types.JS)(get(endpoint + "/bundle")); - }; - - // | Get the JS bundle for the Thermite backend, which includes additional dependencies - var getThermiteBundle = function (endpoint) { - var onComplete = function (dictPartial) { - return function (v) { - var $__unused = function (dictPartial1) { - return function ($dollar26) { - return $dollar26; - }; - }; - return $__unused(dictPartial)((function () { - if (v.length === 4) { - var replaced = Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react-dom\\/server\"\\)")(Data_String_Regex_Flags.global))("window.ReactDOM")(Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react-dom\"\\)")(Data_String_Regex_Flags.global))("window.ReactDOM")(Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react\"\\)")(Data_String_Regex_Flags.global))("window.React")(v[3]))); - return Data_Foldable.intercalate(Data_Foldable.foldableArray)(Data_Monoid.monoidString)("\x0a")([ v[0], v[1], v[2], replaced ]); - }; - throw new Error("Failed pattern match at Try.API line 165, column 7 - line 167, column 23: " + [ v.constructor.name ]); - })()); - }; - }; - var getAll = Control_Parallel.parTraverse(Control_Parallel_Class.monadParExceptT(Control_Parallel_Class.monadParParCont(Effect_Class.monadEffectEffect)))(Data_Traversable.traversableArray)(get)([ "js/console.js", "js/react.min.js", "js/react-dom.min.js", endpoint + "/bundle" ]); - return Data_Functor.map(Control_Monad_Except_Trans.functorExceptT(Control_Monad_Cont_Trans.functorContT(Effect.functorEffect)))(onComplete())(getAll); - }; var genericSuggestion = new Data_Generic_Rep.Generic(function (x) { return x; }, function (x) { @@ -5247,7 +5580,7 @@ var PS = {}; if (x instanceof OtherError) { return new Data_Generic_Rep.Inr(x.value0); }; - throw new Error("Failed pattern match at Try.API line 72, column 8 - line 72, column 62: " + [ x.constructor.name ]); + throw new Error("Failed pattern match at Try.API line 62, column 8 - line 62, column 62: " + [ x.constructor.name ]); }, function (x) { if (x instanceof Data_Generic_Rep.Inl) { return new CompilerErrors(x.value0); @@ -5255,7 +5588,7 @@ var PS = {}; if (x instanceof Data_Generic_Rep.Inr) { return new OtherError(x.value0); }; - throw new Error("Failed pattern match at Try.API line 72, column 8 - line 72, column 62: " + [ x.constructor.name ]); + throw new Error("Failed pattern match at Try.API line 62, column 8 - line 62, column 62: " + [ x.constructor.name ]); }); var decodingOptions = { sumEncoding: Foreign_Generic.defaultOptions.sumEncoding, @@ -5334,17 +5667,273 @@ var PS = {}; return function (code) { return function (k) { return function () { - return $foreign.compile_(endpoint, code, function ($67) { - return k(Data_Either.Right.create(Control_Monad_Except.runExcept(Foreign_Class.decode(decodeCompileResult)($67))))(); - }, function ($68) { - return k(Data_Either.Left.create($68))(); + return $foreign.compile_(endpoint, code, function ($37) { + return k(Data_Either.Right.create(Control_Monad_Except.runExcept(Foreign_Class.decode(decodeCompileResult)($37))))(); + }, function ($38) { + return k(Data_Either.Left.create($38))(); }); }; }; }; }; + exports["CompilerErrors"] = CompilerErrors; + exports["OtherError"] = OtherError; + exports["CompileSuccess"] = CompileSuccess; + exports["CompileFailed"] = CompileFailed; + exports["get"] = get; + exports["compile"] = compile; + exports["genericErrorPosition"] = genericErrorPosition; + exports["decodeErrorPosition"] = decodeErrorPosition; + exports["genericCompilerError"] = genericCompilerError; + exports["decodeCompilerError"] = decodeCompilerError; + exports["genericCompileError"] = genericCompileError; + exports["decodeCompileError"] = decodeCompileError; + exports["genericSuggestion"] = genericSuggestion; + exports["decodeSuggestion"] = decodeSuggestion; + exports["genericCompileWarning"] = genericCompileWarning; + exports["decodeCompileWarning"] = decodeCompileWarning; + exports["genericSuccessResult"] = genericSuccessResult; + exports["genericFailedResult"] = genericFailedResult; + exports["decodeCompileResult"] = decodeCompileResult; +})(PS["Try.API"] = PS["Try.API"] || {}); +(function(exports) { + "use strict"; + var Data_Newtype = PS["Data.Newtype"]; + var Foreign_Class = PS["Foreign.Class"]; + var JS = function (x) { + return x; + }; + var newtypeJS = new Data_Newtype.Newtype(function (n) { + return n; + }, JS); + var encodeJS = Foreign_Class.stringEncode; + exports["JS"] = JS; + exports["newtypeJS"] = newtypeJS; + exports["encodeJS"] = encodeJS; +})(PS["Try.Types"] = PS["Try.Types"] || {}); +(function(exports) { + "use strict"; + var Control_Applicative = PS["Control.Applicative"]; + var Control_Bind = PS["Control.Bind"]; + var Control_Monad_Cont = PS["Control.Monad.Cont"]; + var Control_Monad_Cont_Trans = PS["Control.Monad.Cont.Trans"]; + var Control_Monad_Except = PS["Control.Monad.Except"]; + var Control_Monad_Except_Trans = PS["Control.Monad.Except.Trans"]; + var Control_Parallel = PS["Control.Parallel"]; + var Control_Parallel_Class = PS["Control.Parallel.Class"]; + var Control_Semigroupoid = PS["Control.Semigroupoid"]; + var Data_Array = PS["Data.Array"]; + var Data_Array_NonEmpty = PS["Data.Array.NonEmpty"]; + var Data_Foldable = PS["Data.Foldable"]; + var Data_Function = PS["Data.Function"]; + var Data_Functor = PS["Data.Functor"]; + var Data_Maybe = PS["Data.Maybe"]; + var Data_Newtype = PS["Data.Newtype"]; + var Data_Ord = PS["Data.Ord"]; + var Data_Semigroup = PS["Data.Semigroup"]; + var Data_String = PS["Data.String"]; + var Data_String_Common = PS["Data.String.Common"]; + var Data_String_Pattern = PS["Data.String.Pattern"]; + var Data_String_Regex = PS["Data.String.Regex"]; + var Data_String_Regex_Flags = PS["Data.String.Regex.Flags"]; + var Data_String_Regex_Unsafe = PS["Data.String.Regex.Unsafe"]; + var Data_Traversable = PS["Data.Traversable"]; + var Data_Tuple = PS["Data.Tuple"]; + var Effect = PS["Effect"]; + var Effect_Class = PS["Effect.Class"]; + var Effect_Ref = PS["Effect.Ref"]; + var Effect_Unsafe = PS["Effect.Unsafe"]; + var Foreign_Object = PS["Foreign.Object"]; + var Prelude = PS["Prelude"]; + var Try_API = PS["Try.API"]; + var Try_Types = PS["Try.Types"]; + var runLoader = function (v) { + return v; + }; + var requireRegex = Data_String_Regex_Unsafe.unsafeRegex("^var\\s+\\S+\\s*=\\s*require\\([\"']([^\"']*)[\"']\\);")(Data_String_Regex_Flags.noFlags); + var parseDeps = function (current) { + var go = function (line) { + return Control_Bind.bind(Data_Maybe.bindMaybe)(Data_String_Regex.match(requireRegex)(line))(function (v) { + return Control_Bind.bind(Data_Maybe.bindMaybe)(Control_Bind.join(Data_Maybe.bindMaybe)(Data_Array_NonEmpty.index(v)(1)))(function (v1) { + var v2 = Data_String_Common.split("/")(v1); + if (v2.length === 2 && (v2[0] === "." && v2[1] === "foreign.js")) { + return new Data_Maybe.Just({ + name: current + "$Foreign", + path: current + "/foreign.js" + }); + }; + if (v2.length === 3 && (v2[0] === ".." && v2[2] === "index.js")) { + return new Data_Maybe.Just({ + name: v2[1], + path: v2[1] + "/index.js" + }); + }; + return Data_Maybe.Nothing.value; + }); + }); + }; + return function ($34) { + return Data_Array.mapMaybe(go)(Data_String_Common.split("\x0a")(Data_Newtype.unwrap(Try_Types.newtypeJS)($34))); + }; + }; + var makeLoader = function (modFn) { + return function (rootPath) { + var moduleCache = Effect_Unsafe.unsafePerformEffect(Effect_Ref["new"](Foreign_Object.empty)); + var putModule = function (a) { + return function (b) { + return Effect_Ref.modify_(Foreign_Object.insert(a)(b))(moduleCache); + }; + }; + var getModule = function (a) { + return Data_Functor.map(Effect.functorEffect)(Foreign_Object.lookup(a))(Effect_Ref.read(moduleCache)); + }; + var load = function (v) { + return Control_Bind.bind(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(Effect_Class.liftEffect(Control_Monad_Except_Trans.monadEffectExceptT(Control_Monad_Cont_Trans.monadEffectContT(Effect_Class.monadEffectEffect)))(getModule(v.name)))(function (v1) { + if (v1 instanceof Data_Maybe.Just) { + return Control_Applicative.pure(Control_Monad_Except_Trans.applicativeExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(v1.value0); + }; + if (v1 instanceof Data_Maybe.Nothing) { + return Control_Bind.bind(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(Data_Functor.map(Control_Monad_Except_Trans.functorExceptT(Control_Monad_Cont_Trans.functorContT(Effect.functorEffect)))(Try_Types.JS)(Try_API.get(rootPath + ("/" + v.path))))(function (v2) { + var mod = modFn({ + name: v.name, + path: v.path, + deps: parseDeps(v.name)(v2), + src: v2 + }); + return Control_Bind.discard(Control_Bind.discardUnit)(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(Effect_Class.liftEffect(Control_Monad_Except_Trans.monadEffectExceptT(Control_Monad_Cont_Trans.monadEffectContT(Effect_Class.monadEffectEffect)))(putModule(v.name)(mod)))(function () { + return Control_Applicative.pure(Control_Monad_Except_Trans.applicativeExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(mod); + }); + }); + }; + throw new Error("Failed pattern match at Try.Loader line 93, column 5 - line 99, column 17: " + [ v1.constructor.name ]); + }); + }; + var go = function (deps) { + return function (accum) { + return Control_Bind.bind(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(Control_Parallel.parTraverse(Control_Parallel_Class.monadParExceptT(Control_Parallel_Class.monadParParCont(Effect_Class.monadEffectEffect)))(Data_Traversable.traversableArray)(load)(deps))(function (v) { + var more = Data_Array.nubBy(Data_Ord.comparing(Data_Ord.ordString)(function (v1) { + return v1.name; + }))(Control_Bind.bindFlipped(Control_Bind.bindArray)(function (v1) { + return v1.deps; + })(v)); + var accum$prime = Foreign_Object.union(accum)(Foreign_Object.fromFoldable(Data_Foldable.foldableArray)(Data_Functor.map(Data_Functor.functorArray)(function (v1) { + return new Data_Tuple.Tuple(v1.name, v1.src); + })(v))); + if (more.length === 0) { + return Control_Applicative.pure(Control_Monad_Except_Trans.applicativeExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(accum$prime); + }; + return go(more)(accum$prime); + }); + }; + }; + return function (js) { + var initDeps = parseDeps("")(js); + return Control_Bind.bind(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(go(initDeps)(Foreign_Object.empty))(function (v) { + return Control_Applicative.pure(Control_Monad_Except_Trans.applicativeExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(v); + }); + }; + }; + }; + exports["makeLoader"] = makeLoader; + exports["runLoader"] = runLoader; +})(PS["Try.Loader"] = PS["Try.Loader"] || {}); +(function(exports) { + // Generated by purs version 0.12.0 + "use strict"; + var Control_Category = PS["Control.Category"]; + var Control_Monad_Cont = PS["Control.Monad.Cont"]; + var Control_Monad_Cont_Trans = PS["Control.Monad.Cont.Trans"]; + var Control_Monad_Except = PS["Control.Monad.Except"]; + var Control_Monad_Except_Trans = PS["Control.Monad.Except.Trans"]; + var Control_Parallel = PS["Control.Parallel"]; + var Control_Parallel_Class = PS["Control.Parallel.Class"]; + var Data_Either = PS["Data.Either"]; + var Data_Eq = PS["Data.Eq"]; + var Data_Foldable = PS["Data.Foldable"]; + var Data_Function = PS["Data.Function"]; + var Data_Functor = PS["Data.Functor"]; + var Data_List_NonEmpty = PS["Data.List.NonEmpty"]; + var Data_Monoid = PS["Data.Monoid"]; + var Data_Ord = PS["Data.Ord"]; + var Data_Ordering = PS["Data.Ordering"]; + var Data_Semigroup = PS["Data.Semigroup"]; + var Data_String_Regex = PS["Data.String.Regex"]; + var Data_String_Regex_Flags = PS["Data.String.Regex.Flags"]; + var Data_String_Regex_Unsafe = PS["Data.String.Regex.Unsafe"]; + var Data_Traversable = PS["Data.Traversable"]; + var Effect = PS["Effect"]; + var Effect_Class = PS["Effect.Class"]; + var Foreign = PS["Foreign"]; + var Partial_Unsafe = PS["Partial.Unsafe"]; + var Prelude = PS["Prelude"]; + var Try_API = PS["Try.API"]; + var Try_Loader = PS["Try.Loader"]; + var Try_Types = PS["Try.Types"]; + var Core = (function () { + function Core() { + + }; + Core.value = new Core(); + return Core; + })(); + var Thermite = (function () { + function Thermite() { + + }; + Thermite.value = new Thermite(); + return Thermite; + })(); + var Slides = (function () { + function Slides() { + + }; + Slides.value = new Slides(); + return Slides; + })(); + var Mathbox = (function () { + function Mathbox() { - // TODO: Fix paths + }; + Mathbox.value = new Mathbox(); + return Mathbox; + })(); + var Behaviors = (function () { + function Behaviors() { + + }; + Behaviors.value = new Behaviors(); + return Behaviors; + })(); + var Flare = (function () { + function Flare() { + + }; + Flare.value = new Flare(); + return Flare; + })(); + var getThermiteBundle = function (endpoint) { + var onComplete = function (dictPartial) { + return function (v) { + var $__unused = function (dictPartial1) { + return function ($dollar9) { + return $dollar9; + }; + }; + return $__unused(dictPartial)((function () { + if (v.length === 4) { + var replaced = Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react-dom\\/server\"\\)")(Data_String_Regex_Flags.global))("window.ReactDOM")(Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react-dom\"\\)")(Data_String_Regex_Flags.global))("window.ReactDOM")(Data_String_Regex.replace(Data_String_Regex_Unsafe.unsafeRegex("require\\(\"react\"\\)")(Data_String_Regex_Flags.global))("window.React")(v[3]))); + return Data_Foldable.intercalate(Data_Foldable.foldableArray)(Data_Monoid.monoidString)("\x0a")([ v[0], v[1], v[2], replaced ]); + }; + throw new Error("Failed pattern match at Try.Backend line 83, column 7 - line 85, column 23: " + [ v.constructor.name ]); + })()); + }; + }; + var getAll = Control_Parallel.parTraverse(Control_Parallel_Class.monadParExceptT(Control_Parallel_Class.monadParParCont(Effect_Class.monadEffectEffect)))(Data_Traversable.traversableArray)(Try_API.get)([ "js/console.js", "js/react.min.js", "js/react-dom.min.js", endpoint + "/bundle" ]); + return Data_Functor.map(Control_Monad_Except_Trans.functorExceptT(Control_Monad_Cont_Trans.functorContT(Effect.functorEffect)))(onComplete())(getAll); + }; + var getDefaultBundle = function (endpoint) { + return Data_Functor.map(Control_Monad_Except_Trans.functorExceptT(Control_Monad_Cont_Trans.functorContT(Effect.functorEffect)))(Try_Types.JS)(Try_API.get(endpoint + "/bundle")); + }; var getBackendConfig = function (v) { if (v instanceof Core) { return { @@ -5352,8 +5941,8 @@ var PS = {}; mainGist: "b57a766d417e109785540d584266fc33", extra_styling: "", extra_body: "", - resolve: resolver("staging/core/.psci_modules/node_modules"), - compile: compile("http://localhost:8081"), + loader: Try_Loader.makeLoader(Control_Category.identity(Control_Category.categoryFn))("staging/core/.psci_modules/node_modules"), + compile: Try_API.compile("http://localhost:8081"), getBundle: getDefaultBundle("http://localhost:8081") }; }; @@ -5363,8 +5952,8 @@ var PS = {}; mainGist: "85383bb058471109cfef379bbb6bc11c", extra_styling: "", extra_body: "
", - resolve: resolver("staging/thermite/.psci-modules/node_modules"), - compile: compile("https://compile.purescript.org/thermite"), + loader: Try_Loader.makeLoader(Control_Category.identity(Control_Category.categoryFn))("staging/core/.psci_modules/node_modules"), + compile: Try_API.compile("https://compile.purescript.org/thermite"), getBundle: getThermiteBundle("https://compile.purescript.org/thermite") }; }; @@ -5374,8 +5963,8 @@ var PS = {}; mainGist: "c62b5778a6a5f2bcd32dd97b294c068a", extra_styling: "", extra_body: "
", - resolve: resolver("staging/slides/.psci-modules/node_modules"), - compile: compile("https://compile.purescript.org/slides"), + loader: Try_Loader.makeLoader(Control_Category.identity(Control_Category.categoryFn))("staging/core/.psci_modules/node_modules"), + compile: Try_API.compile("https://compile.purescript.org/slides"), getBundle: getDefaultBundle("https://compile.purescript.org/slides") }; }; @@ -5385,8 +5974,8 @@ var PS = {}; mainGist: "81f8bb3261b9c819d677de2ea54a4d2e", extra_styling: Data_Foldable.fold(Data_Foldable.foldableArray)(Data_Monoid.monoidString)([ "", "" ]), extra_body: "", - resolve: resolver("staging/mathbox/.psci-modules/node_modules"), - compile: compile("https://compile.purescript.org/purescript-mathbox"), + loader: Try_Loader.makeLoader(Control_Category.identity(Control_Category.categoryFn))("staging/core/.psci_modules/node_modules"), + compile: Try_API.compile("https://compile.purescript.org/purescript-mathbox"), getBundle: getDefaultBundle("https://compile.purescript.org/purescript-mathbox") }; }; @@ -5396,8 +5985,8 @@ var PS = {}; mainGist: "ff1e87f0872d2d891e77d209d8f7706d", extra_styling: "", extra_body: "", - resolve: resolver("staging/behaviors/.psci-modules/node_modules"), - compile: compile("https://compile.purescript.org/behaviors"), + loader: Try_Loader.makeLoader(Control_Category.identity(Control_Category.categoryFn))("staging/core/.psci_modules/node_modules"), + compile: Try_API.compile("https://compile.purescript.org/behaviors"), getBundle: getDefaultBundle("https://compile.purescript.org/behaviors") }; }; @@ -5407,18 +5996,18 @@ var PS = {}; mainGist: "4f54d6dd213caa54d736ead597e17fee", extra_styling: "", extra_body: Data_Foldable.fold(Data_Foldable.foldableArray)(Data_Monoid.monoidString)([ "
", "
", "
", "" ]), - resolve: resolver("staging/flare/.psci-modules/node_modules"), - compile: compile("https://compile.purescript.org/flare"), + loader: Try_Loader.makeLoader(Control_Category.identity(Control_Category.categoryFn))("staging/core/.psci_modules/node_modules"), + compile: Try_API.compile("https://compile.purescript.org/flare"), getBundle: getDefaultBundle("https://compile.purescript.org/flare") }; }; - throw new Error("Failed pattern match at Try.API line 249, column 1 - line 249, column 45: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Try.Backend line 95, column 1 - line 95, column 45: " + [ v.constructor.name ]); }; var backendFromString = function (dictPartial) { return function (v) { var $__unused = function (dictPartial1) { - return function ($dollar31) { - return $dollar31; + return function ($dollar14) { + return $dollar14; }; }; return $__unused(dictPartial)((function () { @@ -5440,17 +6029,13 @@ var PS = {}; if (v === "flare") { return Flare.value; }; - throw new Error("Failed pattern match at Try.API line 229, column 1 - line 229, column 50: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Try.Backend line 46, column 1 - line 46, column 50: " + [ v.constructor.name ]); })()); }; }; var getBackendConfigFromString = function (s) { return getBackendConfig(backendFromString()(s)); }; - exports["CompilerErrors"] = CompilerErrors; - exports["OtherError"] = OtherError; - exports["CompileSuccess"] = CompileSuccess; - exports["CompileFailed"] = CompileFailed; exports["Core"] = Core; exports["Thermite"] = Thermite; exports["Slides"] = Slides; @@ -5459,20 +6044,7 @@ var PS = {}; exports["Flare"] = Flare; exports["getBackendConfig"] = getBackendConfig; exports["getBackendConfigFromString"] = getBackendConfigFromString; - exports["genericErrorPosition"] = genericErrorPosition; - exports["decodeErrorPosition"] = decodeErrorPosition; - exports["genericCompilerError"] = genericCompilerError; - exports["decodeCompilerError"] = decodeCompilerError; - exports["genericCompileError"] = genericCompileError; - exports["decodeCompileError"] = decodeCompileError; - exports["genericSuggestion"] = genericSuggestion; - exports["decodeSuggestion"] = decodeSuggestion; - exports["genericCompileWarning"] = genericCompileWarning; - exports["decodeCompileWarning"] = decodeCompileWarning; - exports["genericSuccessResult"] = genericSuccessResult; - exports["genericFailedResult"] = genericFailedResult; - exports["decodeCompileResult"] = decodeCompileResult; -})(PS["Try.API"] = PS["Try.API"] || {}); +})(PS["Try.Backend"] = PS["Try.Backend"] || {}); (function(exports) { "use strict"; @@ -5885,7 +6457,8 @@ var PS = {}; exports["window"] = $foreign.window; })(PS["Web.HTML"] = PS["Web.HTML"] || {}); (function(exports) { - "use strict"; + // Generated by purs version 0.12.0 + "use strict"; var $foreign = PS["Main"]; var Control_Applicative = PS["Control.Applicative"]; var Control_Bind = PS["Control.Bind"]; @@ -5902,7 +6475,6 @@ var PS = {}; var Data_List_Types = PS["Data.List.Types"]; var Data_Maybe = PS["Data.Maybe"]; var Data_Monoid = PS["Data.Monoid"]; - var Data_Newtype = PS["Data.Newtype"]; var Data_Ring = PS["Data.Ring"]; var Data_Semigroup = PS["Data.Semigroup"]; var Data_Semiring = PS["Data.Semiring"]; @@ -5922,7 +6494,9 @@ var PS = {}; var JQuery_Extras = PS["JQuery.Extras"]; var Prelude = PS["Prelude"]; var Try_API = PS["Try.API"]; + var Try_Backend = PS["Try.Backend"]; var Try_Gist = PS["Try.Gist"]; + var Try_Loader = PS["Try.Loader"]; var Try_QueryString = PS["Try.QueryString"]; var Try_Session = PS["Try.Session"]; var Try_Types = PS["Try.Types"]; @@ -5932,8 +6506,6 @@ var PS = {}; var setTextAreaContent = function (value) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery.setValue(value)); }; - - // | Navigate to the specified URL. var navigateTo = function (uri) { return Data_Functor["void"](Effect.functorEffect)(Control_Bind.bind(Effect.bindEffect)(Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.location))(Web_HTML_Location.setHref(uri))); }; @@ -5958,7 +6530,7 @@ var PS = {}; backend: backend }); }; - throw new Error("Failed pattern match at Main line 253, column 5 - line 257, column 40: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Main line 254, column 5 - line 258, column 40: " + [ v.constructor.name ]); }); }; }; @@ -5970,17 +6542,17 @@ var PS = {}; if (v instanceof Data_Maybe.Just) { return k({ code: v.value0.code, - backend: Try_API.getBackendConfigFromString(v.value0.backend) + backend: Try_Backend.getBackendConfigFromString(v.value0.backend) })(); }; if (v instanceof Data_Maybe.Nothing) { var v1 = Data_Functor.map(Effect.functorEffect)(function ($132) { - return Try_API.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($132)); + return Try_Backend.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($132)); })(Try_QueryString.getQueryStringMaybe("backend"))(); var v2 = Data_Functor.map(Effect.functorEffect)(Data_Maybe.fromMaybe(v1.mainGist))(Try_QueryString.getQueryStringMaybe("gist"))(); return loadFromGist(v2)(v1)(k)(); }; - throw new Error("Failed pattern match at Main line 265, column 3 - line 271, column 29: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Main line 266, column 3 - line 272, column 29: " + [ v.constructor.name ]); }; }; }; @@ -5994,8 +6566,6 @@ var PS = {}; }; var hideLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeOut); var getTextAreaContent = Data_Functor.map(Effect.functorEffect)(Data_Foldable.fold(Data_Foldable.foldableMaybe)(Data_Monoid.monoidString))(Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery_Extras.getValueMaybe)); - - // | Create a new Gist using the current content var publishNewGist = function (v) { return function __do() { var v1 = Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.confirm(Data_Foldable.intercalate(Data_Foldable.foldableArray)(Data_Monoid.monoidString)("\x0a")([ "Do you really want to publish this code as an anonymous Gist?", "", "Note: this code will be available to anyone with a link to the Gist." ])))(); @@ -6011,19 +6581,17 @@ var PS = {}; if (v3 instanceof Data_Either.Right) { return Try_QueryString.setQueryStrings(Data_Semigroup.append(Foreign_Object.semigroupObject(Data_Semigroup.semigroupString))(Foreign_Object.singleton("gist")(v3.value0))(Foreign_Object.singleton("backend")(v.backend))); }; - throw new Error("Failed pattern match at Main line 294, column 7 - line 300, column 71: " + [ v3.constructor.name ]); + throw new Error("Failed pattern match at Main line 295, column 7 - line 301, column 71: " + [ v3.constructor.name ]); })(); })(); }; }; - - // | Execute the compiled code in a new iframe. var execute = function (js) { return function (sources) { return function (v) { - var json = Foreign_Generic.encodeJSON(Foreign_Class.objectEncode(Foreign_Class.stringEncode))(Foreign_Object.insert("")(Data_Newtype.unwrap(Try_Types.newtypeJS)(js))(sources)); - var scripts = Data_String_Common.joinWith("\x0a")([ "var load = PSLoader(" + (json + ");"), "load(\"\").main();" ]); - var html = Data_String_Common.joinWith("\x0a")([ "", "", " ", " ", " ", " ", " Try PureScript!", " ", " ", v.extra_styling, " ", " ", v.extra_body, " ", "" ]); + var json = Foreign_Generic.encodeJSON(Foreign_Class.objectEncode(Try_Types.encodeJS))(Foreign_Object.insert("")(js)(sources)); + var scripts = Data_String_Common.joinWith("\x0a")([ "var load = PSRequireShim(" + (json + ");"), "load(\"\").main();" ]); + var html = Data_String_Common.joinWith("\x0a")([ "", "", " ", " ", " ", " ", " Try PureScript!", " ", " ", v.extra_styling, " ", " ", v.extra_body, " ", "" ]); return function __do() { var v1 = JQuery.select("#column2")(); return $foreign.setupIFrame(v1, html, scripts); @@ -6031,8 +6599,6 @@ var PS = {}; }; }; }; - - // | Display plain text in the right hand column. var displayPlainText = function (s) { return function __do() { var v = JQuery.select("#column2")(); @@ -6045,8 +6611,6 @@ var PS = {}; }; }; var displayLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeIn); - - // | Display a list of errors in the right hand column. var displayErrors = function (errs) { return function __do() { var v = JQuery.select("#column2")(); @@ -6071,8 +6635,6 @@ var PS = {}; var clearAnnotations = function () { return $foreign.setAnnotations([ ]); }; - - // | Compile the current code and execute it. var compile = function (v) { return function __do() { var v1 = getTextAreaContent(); @@ -6091,7 +6653,7 @@ var PS = {}; hideLoadingMessage(); return displayPlainText(res_.value0.value0.value0.js)(); }; - return Control_Monad_Cont_Trans.runContT(v.resolve(res_.value0.value0.value0.js))(function (sources) { + return Control_Monad_Cont_Trans.runContT(Control_Monad_Except_Trans.runExceptT(Try_Loader.runLoader(v.loader)(res_.value0.value0.value0.js)))(function (sources) { return function __do() { hideLoadingMessage(); Data_Foldable.for_(Effect.applicativeEffect)(Data_Foldable.foldableMaybe)(res_.value0.value0.value0.warnings)(function (warnings_) { @@ -6109,7 +6671,9 @@ var PS = {}; return $foreign.setAnnotations(Data_Array.mapMaybe(toAnnotation)(warnings_)); }; })(); - return execute(res_.value0.value0.value0.js)(sources)(v)(); + return Data_Foldable.for_(Effect.applicativeEffect)(Data_Either.foldableEither)(sources)(function (sources$prime) { + return execute(res_.value0.value0.value0.js)(sources$prime)(v); + })(); }; })(); }; @@ -6139,7 +6703,7 @@ var PS = {}; if (res_.value0.value0.value0.error instanceof Try_API.OtherError) { return displayPlainText(res_.value0.value0.value0.error.value0)(); }; - throw new Error("Failed pattern match at Main line 160, column 13 - line 181, column 53: " + [ res_.value0.value0.value0.error.constructor.name ]); + throw new Error("Failed pattern match at Main line 161, column 13 - line 182, column 53: " + [ res_.value0.value0.value0.error.constructor.name ]); }; if (res_.value0 instanceof Data_Either.Left) { hideLoadingMessage(); @@ -6148,22 +6712,18 @@ var PS = {}; return Effect_Console.error(Foreign.renderForeignError($133)); })(res_.value0.value0)(); }; - throw new Error("Failed pattern match at Main line 140, column 9 - line 185, column 58: " + [ res_.value0.constructor.name ]); + throw new Error("Failed pattern match at Main line 140, column 9 - line 186, column 58: " + [ res_.value0.constructor.name ]); }; }; - throw new Error("Failed pattern match at Main line 135, column 5 - line 185, column 58: " + [ res_.constructor.name ]); + throw new Error("Failed pattern match at Main line 135, column 5 - line 186, column 58: " + [ res_.constructor.name ]); })(); }; }; - - // | Update the view mode based on the menu selection var changeViewMode = function (viewMode) { return Data_Foldable.for_(Effect.applicativeEffect)(Data_Foldable.foldableMaybe)(viewMode)(function (viewMode_) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#editor_view"))(JQuery.setAttr("data-view-mode")(viewMode_)); }); }; - - // | Read query string options and update the state accordingly var loadOptions = function (bc) { return function __do() { var v = Try_QueryString.getQueryStringMaybe("view")(); @@ -6196,11 +6756,9 @@ var PS = {}; if (v3 instanceof Data_Maybe.Nothing) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select(".view_gist_li"))(JQuery.hide)(); }; - throw new Error("Failed pattern match at Main line 329, column 3 - line 331, column 61: " + [ v3.constructor.name ]); + throw new Error("Failed pattern match at Main line 330, column 3 - line 332, column 61: " + [ v3.constructor.name ]); }; }; - - // | Cache the current code in the session state var cacheCurrentCode = function (v) { return function __do() { var v1 = Try_QueryString.getQueryStringMaybe("session")(); @@ -6214,11 +6772,9 @@ var PS = {}; if (v1 instanceof Data_Maybe.Nothing) { return Effect_Console.error("No session ID")(); }; - throw new Error("Failed pattern match at Main line 277, column 3 - line 283, column 1: " + [ v1.constructor.name ]); + throw new Error("Failed pattern match at Main line 278, column 3 - line 284, column 1: " + [ v1.constructor.name ]); }; }; - - // | Setup event listeners for the backend dropdown menu. var setupBackendMenu = function (v) { return function __do() { Control_Bind.bind(Effect.bindEffect)(JQuery.select("#backend_" + v.backend))(JQuery.attr({ @@ -6228,7 +6784,7 @@ var PS = {}; return function (jq) { return function __do() { var v1 = Data_Functor.map(Effect.functorEffect)(function ($134) { - return Try_API.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($134)); + return Try_Backend.getBackendConfigFromString(Data_Maybe.fromMaybe("core")($134)); })(JQuery_Extras.getValueMaybe(jq))(); var v2 = Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.confirm("Replace your current code with the " + (v1.backend + " backend sample code?")))(); if (v2) { @@ -6243,8 +6799,6 @@ var PS = {}; }))(); }; }; - - // | Setup the editor component and some event handlers. var setupEditor = function (v) { return function __do() { loadOptions(v.backend)(); diff --git a/js/ps-loader.js b/js/ps-loader.js deleted file mode 100644 index 07d57dc8..00000000 --- a/js/ps-loader.js +++ /dev/null @@ -1,111 +0,0 @@ -var PSMODULE = /^\.\.\/(.*)+\/index\.js$/; - -function PSResolver(output) { - var REQUIRE = /(\/\*[\w\W]*?\*\/|\/\/[^\n]*|[.$]r)|\brequire\s*\(\s*["']([^"']*)["']\s*\)/g; - var CACHE = {}; - - function getDeps(current, src) { - var modules = []; - src.replace(REQUIRE, function(all, ignore, id) { - if (!ignore) { - if (id === "./foreign.js") { - modules.push({ - module: current + "$Foreign", - path: [output, current, "foreign.js"].join("/") - }) - } else { - var mod = id.match(PSMODULE)[1]; - modules.push({ - module: mod, - path: [output, mod, "index.js"].join("/") - }); - } - } - }); - return modules; - } - - function load(mod, path) { - var cached = CACHE[mod]; - if (cached) { - return Promise.resolve({ - module: mod, - src: cached - }); - } - return fetch(path) - .then(function(resp) { - return resp.text(); - }) - .then(function(src) { - return { - module: mod, - src: src - }; - }); - } - - function go(modules, accum) { - return Promise.all( - modules.map(function(dep) { - return load(dep.module, dep.path); - }) - ).then(function(sources) { - var pass = {}; - var more = []; - sources.forEach(function(source) { - CACHE[source.module] = source.src; - accum[source.module] = source.src; - var deps = getDeps(source.module, source.src); - deps.forEach(function(dep) { - if (!pass[dep.module]) { - pass[dep.module] = true; - more.push(dep); - } - }); - }); - if (more.length) { - return go(more, accum); - } else { - return accum; - } - }); - } - - return function(src) { - return function(cb) { - return function() { - go(getDeps("", src), {}).then(function(result) { - cb(result)(); - }).catch(function(err) { - console.error(err); - cb({}); - }); - }; - }; - }; -} - -function PSLoader(sources) { - var modules = {}; - return function load(name) { - if (modules[name]) { - return modules[name].exports; - } - var src = sources[name]; - if (src == null) { - throw new Error("Module not found: " + name); - } - function req(path) { - if (path === "./foreign.js") { - return load(name + "$Foreign"); - } else { - return load(path.match(PSMODULE)[1]); - } - } - var mod = { exports: {} }; - modules[name] = mod; - new Function("module", "exports", "require", src)(mod, mod.exports, req); - return mod.exports; - } -} diff --git a/js/ps-require-shim.js b/js/ps-require-shim.js new file mode 100644 index 00000000..7e66f42a --- /dev/null +++ b/js/ps-require-shim.js @@ -0,0 +1,24 @@ +function PSRequireShim(sources) { + var nameRegex = /^\.\.\/(.*)+\/index\.js$/; + var modules = {}; + return function load(name) { + if (modules[name]) { + return modules[name].exports; + } + var src = sources[name]; + if (src == null) { + throw new Error("Module not found: " + name); + } + function req(path) { + if (path === "./foreign.js") { + return load(name + "$Foreign"); + } else { + return load(path.match(nameRegex)[1]); + } + } + var mod = { exports: {} }; + modules[name] = mod; + new Function("module", "exports", "require", src)(mod, mod.exports, req); + return mod.exports; + } +} diff --git a/src/Main.purs b/src/Main.purs index fa593716..eb899909 100644 --- a/src/Main.purs +++ b/src/Main.purs @@ -10,7 +10,6 @@ import Data.Either (Either(..)) import Data.Foldable (elem, fold, for_, intercalate, traverse_) import Data.FoldableWithIndex (forWithIndex_) import Data.Maybe (Maybe(..), fromMaybe) -import Data.Newtype (unwrap) import Data.String (joinWith) import Effect (Effect) import Effect.Console (error) @@ -21,9 +20,10 @@ import Foreign.Generic (encodeJSON) import Foreign.Object as Object import JQuery as JQuery import JQuery.Extras as JQueryExtras -import Try.API (BackendConfig(..), CompileError(..), CompileResult(..), CompileWarning(..), CompilerError(..), ErrorPosition(..), FailedResult(..), SuccessResult(..), getBackendConfigFromString) -import Try.API as API +import Try.API (CompileError(..), CompileResult(..), CompileWarning(..), CompilerError(..), ErrorPosition(..), FailedResult(..), SuccessResult(..)) +import Try.Backend (BackendConfig(..), getBackendConfigFromString) import Try.Gist (getGistById, tryLoadFileFromGist, uploadGist) +import Try.Loader (runLoader) import Try.QueryString (getQueryStringMaybe, setQueryStrings) import Try.Session (createSessionIdIfNecessary, storeSession, tryRetrieveSession) import Try.Types (JS(..)) @@ -143,7 +143,7 @@ compile bc@(BackendConfig backend) = do if showJs then do hideLoadingMessage displayPlainText js - else runContT (backend.resolve js) \sources -> do + else runContT (runExceptT $ runLoader backend.loader (JS js)) \sources -> do hideLoadingMessage for_ warnings \warnings_ -> do let toAnnotation (CompileWarning{ errorCode, position, message }) = @@ -154,7 +154,8 @@ compile bc@(BackendConfig backend) = do , text: message } runEffectFn1 setAnnotations (mapMaybe toAnnotation warnings_) - execute (JS js) sources bc + for_ sources \sources' -> + execute (JS js) sources' bc Right (CompileFailed (FailedResult { error })) -> do hideLoadingMessage case error of @@ -185,7 +186,7 @@ compile bc@(BackendConfig backend) = do traverse_ (error <<< renderForeignError) errs -- | Execute the compiled code in a new iframe. -execute :: JS -> Object.Object String -> BackendConfig -> Effect Unit +execute :: JS -> Object.Object JS -> BackendConfig -> Effect Unit execute js sources bc@(BackendConfig backend) = do let html = joinWith "\n" [ """""" @@ -195,7 +196,7 @@ execute js sources bc@(BackendConfig backend) = do , """ """ , """ """ , """ Try PureScript!""" - , """ """ + , """ """ , """ """ , backend.extra_styling , """ """ @@ -205,10 +206,10 @@ execute js sources bc@(BackendConfig backend) = do , """""" ] - json = encodeJSON (Object.insert "" (unwrap js) sources) + json = encodeJSON (Object.insert "" js sources) scripts = joinWith "\n" - [ "var load = PSLoader(" <> json <> ");" + [ "var load = PSRequireShim(" <> json <> ");" , """load("").main();""" ] @@ -264,9 +265,9 @@ withSession sessionId k = do state <- tryRetrieveSession sessionId case state of Just { code, backend } -> do - k { code, backend: API.getBackendConfigFromString backend } + k { code, backend: getBackendConfigFromString backend } Nothing -> do - bc@(BackendConfig backend) <- API.getBackendConfigFromString <<< fromMaybe "core" <$> getQueryStringMaybe "backend" + bc@(BackendConfig backend) <- getBackendConfigFromString <<< fromMaybe "core" <$> getQueryStringMaybe "backend" gist <- fromMaybe backend.mainGist <$> getQueryStringMaybe "gist" loadFromGist gist bc k diff --git a/src/Try/API.js b/src/Try/API.js index 77024739..a00c83f8 100644 --- a/src/Try/API.js +++ b/src/Try/API.js @@ -1,7 +1,5 @@ "use strict"; -exports.resolver_ = PSResolver; - exports.get_ = function(uri, done, fail) { $.get(uri).done(done).fail(function(err) { fail(err.statusText); diff --git a/src/Try/API.purs b/src/Try/API.purs index dd238e5d..3e205921 100644 --- a/src/Try/API.purs +++ b/src/Try/API.purs @@ -7,10 +7,8 @@ module Try.API , SuccessResult(..) , FailedResult(..) , CompileResult(..) - , Backend(..) - , BackendConfig(..) - , getBackendConfig - , getBackendConfigFromString + , get + , compile ) where import Prelude @@ -19,24 +17,16 @@ import Control.Alt ((<|>)) import Control.Monad.Cont.Trans (ContT(ContT)) import Control.Monad.Except (runExcept) import Control.Monad.Except.Trans (ExceptT(ExceptT)) -import Control.Parallel (parTraverse) -import Data.Array (fold, intercalate) import Data.Either (Either(..)) import Data.Generic.Rep (class Generic) import Data.List.NonEmpty (NonEmptyList) import Data.Maybe (Maybe) -import Data.String.Regex (replace) -import Data.String.Regex.Flags (global) -import Data.String.Regex.Unsafe (unsafeRegex) import Effect (Effect) import Effect.Uncurried (EffectFn1, EffectFn3, EffectFn4, mkEffectFn1, runEffectFn3, runEffectFn4) import Foreign (Foreign, ForeignError) import Foreign.Class (class Decode, decode) import Foreign.Generic (defaultOptions, genericDecode) import Foreign.Generic.Types (Options, SumEncoding(..)) -import Foreign.Object (Object) -import Partial.Unsafe (unsafePartial) -import Try.Types (JS(JS)) decodingOptions :: Options decodingOptions = defaultOptions { unwrapSingleConstructors = true } @@ -144,35 +134,6 @@ foreign import get_ get :: String -> ExceptT String (ContT Unit Effect) String get uri = ExceptT (ContT \k -> runEffectFn3 get_ uri (mkEffectFn1 (k <<< Right)) (mkEffectFn1 (k <<< Left))) --- | Get the default bundle -getDefaultBundle - :: String - -> ExceptT String (ContT Unit Effect) JS -getDefaultBundle endpoint = JS <$> get (endpoint <> "/bundle") - --- | Get the JS bundle for the Thermite backend, which includes additional dependencies -getThermiteBundle - :: String - -> ExceptT String (ContT Unit Effect) JS -getThermiteBundle endpoint = - let getAll = parTraverse get - [ "js/console.js" - , "js/react.min.js" - , "js/react-dom.min.js" - , endpoint <> "/bundle" - ] - - onComplete :: Partial - => Array String - -> JS - onComplete [consoleScript, react, react_dom, bundle] = - let replaced = bundle - # replace (unsafeRegex """require\("react"\)""" global) "window.React" - # replace (unsafeRegex """require\("react-dom"\)""" global) "window.ReactDOM" - # replace (unsafeRegex """require\("react-dom\/server"\)""" global) "window.ReactDOM" - in JS (intercalate "\n" [consoleScript, react, react_dom, replaced]) - in unsafePartial onComplete <$> getAll - -- | POST the specified code to the Try PureScript API, and wait for -- | a response. foreign import compile_ @@ -183,20 +144,6 @@ foreign import compile_ (EffectFn1 String Unit) Unit -foreign import resolver_ - :: String - -> String - -> (Object String -> Effect Unit) - -> Effect Unit - -resolver - :: String - -> String - -> ContT Unit Effect (Object String) -resolver output = \src -> ContT \k -> go src k - where - go = resolver_ output - -- | A wrapper for `compileApi` which uses `ContT`. compile :: String @@ -204,111 +151,3 @@ compile -> ExceptT String (ContT Unit Effect) (Either (NonEmptyList ForeignError) CompileResult) compile endpoint code = ExceptT (ContT \k -> runEffectFn4 compile_ endpoint code (mkEffectFn1 (k <<< Right <<< runExcept <<< decode)) (mkEffectFn1 (k <<< Left))) - -newtype BackendConfig = BackendConfig - { backend :: String - , mainGist :: String - , extra_styling :: String - , extra_body :: String - , resolve :: String - -> ContT Unit Effect (Object String) - , compile :: String - -> ExceptT String (ContT Unit Effect) - (Either (NonEmptyList ForeignError) CompileResult) - , getBundle :: ExceptT String (ContT Unit Effect) JS - } - -data Backend - = Core - | Thermite - | Slides - | Mathbox - | Behaviors - | Flare - -backendFromString :: Partial => String -> Backend -backendFromString "core" = Core -backendFromString "thermite" = Thermite -backendFromString "slides" = Slides -backendFromString "mathbox" = Mathbox -backendFromString "behaviors" = Behaviors -backendFromString "flare" = Flare - -backendToString :: Backend -> String -backendToString Core = "core" -backendToString Thermite = "thermite" -backendToString Slides = "slides" -backendToString Mathbox = "mathbox" -backendToString Behaviors = "behaviors" -backendToString Flare = "flare" - -derive instance eqBackend :: Eq Backend -derive instance ordBackend :: Ord Backend - --- TODO: Fix paths -getBackendConfig :: Backend -> BackendConfig -getBackendConfig Core = BackendConfig - { backend: "core" - , mainGist: "b57a766d417e109785540d584266fc33" - , extra_styling: "" - , extra_body: "" - , resolve: resolver "staging/core/.psci_modules/node_modules" - , compile: compile "http://localhost:8081" - , getBundle: getDefaultBundle "http://localhost:8081" - } -getBackendConfig Thermite = BackendConfig - { backend: "thermite" - , mainGist: "85383bb058471109cfef379bbb6bc11c" - , extra_styling: """""" - , extra_body: """
""" - , resolve: resolver "staging/thermite/.psci-modules/node_modules" - , compile: compile "https://compile.purescript.org/thermite" - , getBundle: getThermiteBundle "https://compile.purescript.org/thermite" - } -getBackendConfig Slides = BackendConfig - { backend: "slides" - , mainGist: "c62b5778a6a5f2bcd32dd97b294c068a" - , extra_styling: """""" - , extra_body: """
""" - , resolve: resolver "staging/slides/.psci-modules/node_modules" - , compile: compile "https://compile.purescript.org/slides" - , getBundle: getDefaultBundle "https://compile.purescript.org/slides" - } -getBackendConfig Mathbox = BackendConfig - { backend: "mathbox" - , mainGist: "81f8bb3261b9c819d677de2ea54a4d2e" - , extra_styling: fold - [ """""" - , """""" - ] - , extra_body: "" - , resolve: resolver "staging/mathbox/.psci-modules/node_modules" - , compile: compile "https://compile.purescript.org/purescript-mathbox" - , getBundle: getDefaultBundle "https://compile.purescript.org/purescript-mathbox" - } -getBackendConfig Behaviors = BackendConfig - { backend: "behaviors" - , mainGist: "ff1e87f0872d2d891e77d209d8f7706d" - , extra_styling: "" - , extra_body: """""" - , resolve: resolver "staging/behaviors/.psci-modules/node_modules" - , compile: compile "https://compile.purescript.org/behaviors" - , getBundle: getDefaultBundle "https://compile.purescript.org/behaviors" - } -getBackendConfig Flare = BackendConfig - { backend: "flare" - , mainGist: "4f54d6dd213caa54d736ead597e17fee" - , extra_styling: """""" - , extra_body: fold - [ """
""" - , """
""" - , """
""" - , """""" - ] - , resolve: resolver "staging/flare/.psci-modules/node_modules" - , compile: compile "https://compile.purescript.org/flare" - , getBundle: getDefaultBundle "https://compile.purescript.org/flare" - } - -getBackendConfigFromString :: String -> BackendConfig -getBackendConfigFromString s = getBackendConfig (unsafePartial backendFromString s) diff --git a/src/Try/Backend.purs b/src/Try/Backend.purs new file mode 100644 index 00000000..7c56ae38 --- /dev/null +++ b/src/Try/Backend.purs @@ -0,0 +1,160 @@ +module Try.Backend + ( Backend(..) + , BackendConfig(..) + , getBackendConfig + , getBackendConfigFromString + ) where + +import Prelude + +import Control.Monad.Cont (ContT) +import Control.Monad.Except (ExceptT) +import Control.Parallel (parTraverse) +import Data.Either (Either) +import Data.Foldable (fold, intercalate) +import Data.List.NonEmpty (NonEmptyList) +import Data.String.Regex (replace) +import Data.String.Regex.Flags (global) +import Data.String.Regex.Unsafe (unsafeRegex) +import Effect (Effect) +import Foreign (ForeignError) +import Partial.Unsafe (unsafePartial) +import Try.API (CompileResult, compile, get) +import Try.Loader (Loader, makeLoader) +import Try.Types (JS(..)) + +newtype BackendConfig = BackendConfig + { backend :: String + , mainGist :: String + , extra_styling :: String + , extra_body :: String + , loader :: Loader + , compile :: String + -> ExceptT String (ContT Unit Effect) + (Either (NonEmptyList ForeignError) CompileResult) + , getBundle :: ExceptT String (ContT Unit Effect) JS + } + +data Backend + = Core + | Thermite + | Slides + | Mathbox + | Behaviors + | Flare + +backendFromString :: Partial => String -> Backend +backendFromString "core" = Core +backendFromString "thermite" = Thermite +backendFromString "slides" = Slides +backendFromString "mathbox" = Mathbox +backendFromString "behaviors" = Behaviors +backendFromString "flare" = Flare + +backendToString :: Backend -> String +backendToString Core = "core" +backendToString Thermite = "thermite" +backendToString Slides = "slides" +backendToString Mathbox = "mathbox" +backendToString Behaviors = "behaviors" +backendToString Flare = "flare" + +derive instance eqBackend :: Eq Backend +derive instance ordBackend :: Ord Backend + +-- | Get the default bundle +getDefaultBundle + :: String + -> ExceptT String (ContT Unit Effect) JS +getDefaultBundle endpoint = JS <$> get (endpoint <> "/bundle") + +-- | Get the JS bundle for the Thermite backend, which includes additional dependencies +getThermiteBundle + :: String + -> ExceptT String (ContT Unit Effect) JS +getThermiteBundle endpoint = + let getAll = parTraverse get + [ "js/console.js" + , "js/react.min.js" + , "js/react-dom.min.js" + , endpoint <> "/bundle" + ] + + onComplete :: Partial + => Array String + -> JS + onComplete [consoleScript, react, react_dom, bundle] = + let replaced = bundle + # replace (unsafeRegex """require\("react"\)""" global) "window.React" + # replace (unsafeRegex """require\("react-dom"\)""" global) "window.ReactDOM" + # replace (unsafeRegex """require\("react-dom\/server"\)""" global) "window.ReactDOM" + in JS (intercalate "\n" [consoleScript, react, react_dom, replaced]) + in unsafePartial onComplete <$> getAll + +-- TODO: Fix paths +getBackendConfig :: Backend -> BackendConfig +getBackendConfig Core = BackendConfig + { backend: "core" + , mainGist: "b57a766d417e109785540d584266fc33" + , extra_styling: "" + , extra_body: "" + , loader: makeLoader identity "staging/core/.psci_modules/node_modules" + , compile: compile "http://localhost:8081" + , getBundle: getDefaultBundle "http://localhost:8081" + } +getBackendConfig Thermite = BackendConfig + { backend: "thermite" + , mainGist: "85383bb058471109cfef379bbb6bc11c" + , extra_styling: """""" + , extra_body: """
""" + , loader: makeLoader identity "staging/core/.psci_modules/node_modules" + , compile: compile "https://compile.purescript.org/thermite" + , getBundle: getThermiteBundle "https://compile.purescript.org/thermite" + } +getBackendConfig Slides = BackendConfig + { backend: "slides" + , mainGist: "c62b5778a6a5f2bcd32dd97b294c068a" + , extra_styling: """""" + , extra_body: """
""" + , loader: makeLoader identity "staging/core/.psci_modules/node_modules" + , compile: compile "https://compile.purescript.org/slides" + , getBundle: getDefaultBundle "https://compile.purescript.org/slides" + } +getBackendConfig Mathbox = BackendConfig + { backend: "mathbox" + , mainGist: "81f8bb3261b9c819d677de2ea54a4d2e" + , extra_styling: fold + [ """""" + , """""" + ] + , extra_body: "" + , loader: makeLoader identity "staging/core/.psci_modules/node_modules" + , compile: compile "https://compile.purescript.org/purescript-mathbox" + , getBundle: getDefaultBundle "https://compile.purescript.org/purescript-mathbox" + } +getBackendConfig Behaviors = BackendConfig + { backend: "behaviors" + , mainGist: "ff1e87f0872d2d891e77d209d8f7706d" + , extra_styling: "" + , extra_body: """""" + , loader: makeLoader identity "staging/core/.psci_modules/node_modules" + , compile: compile "https://compile.purescript.org/behaviors" + , getBundle: getDefaultBundle "https://compile.purescript.org/behaviors" + } +getBackendConfig Flare = BackendConfig + { backend: "flare" + , mainGist: "4f54d6dd213caa54d736ead597e17fee" + , extra_styling: """""" + , extra_body: fold + [ """
""" + , """
""" + , """
""" + , """""" + ] + , loader: makeLoader identity "staging/core/.psci_modules/node_modules" + , compile: compile "https://compile.purescript.org/flare" + , getBundle: getDefaultBundle "https://compile.purescript.org/flare" + } + +getBackendConfigFromString :: String -> BackendConfig +getBackendConfigFromString s = getBackendConfig (unsafePartial backendFromString s) diff --git a/src/Try/Loader.purs b/src/Try/Loader.purs new file mode 100644 index 00000000..72d2b22b --- /dev/null +++ b/src/Try/Loader.purs @@ -0,0 +1,116 @@ +module Try.Loader + ( Loader + , makeLoader + , runLoader + ) where + +import Prelude + +import Control.Bind (bindFlipped) +import Control.Monad.Cont (ContT) +import Control.Monad.Except (ExceptT) +import Control.Parallel (parTraverse) +import Data.Array as Array +import Data.Array.NonEmpty as NonEmpty +import Data.Maybe (Maybe(..)) +import Data.Newtype (unwrap) +import Data.String (Pattern(..)) +import Data.String as String +import Data.String.Regex (Regex) +import Data.String.Regex as Regex +import Data.String.Regex.Flags (noFlags) +import Data.String.Regex.Unsafe (unsafeRegex) +import Data.Tuple (Tuple(..)) +import Effect (Effect) +import Effect.Class (liftEffect) +import Effect.Ref (Ref) +import Effect.Ref as Ref +import Effect.Unsafe (unsafePerformEffect) +import Foreign.Object (Object) +import Foreign.Object as Object +import Try.API as API +import Try.Types (JS(..)) + +type Module = + { name :: String + , path :: String + , deps :: Array Dependency + , src :: JS + } + +type Dependency = + { name :: String + , path :: String + } + +requireRegex :: Regex +requireRegex = unsafeRegex """^var\s+\S+\s*=\s*require\(["']([^"']*)["']\);""" noFlags + +parseDeps :: String -> JS -> Array Dependency +parseDeps current = Array.mapMaybe go <<< String.split (Pattern "\n") <<< unwrap + where + go :: String -> Maybe Dependency + go line = do + match <- Regex.match requireRegex line + requirePath <- join $ NonEmpty.index match 1 + case String.split (Pattern "/") requirePath of + [ ".", "foreign.js" ] -> + Just + { name: current <> "$Foreign" + , path: current <> "/foreign.js" + } + [ "..", name, "index.js" ] -> + Just + { name + , path: name <> "/index.js" + } + _ -> + Nothing + +newtype Loader = Loader (JS -> ExceptT String (ContT Unit Effect) (Object JS)) + +runLoader :: Loader -> JS -> ExceptT String (ContT Unit Effect) (Object JS) +runLoader (Loader k) = k + +makeLoader :: (Module -> Module) -> String -> Loader +makeLoader modFn rootPath = Loader \js -> do + let initDeps = parseDeps "" js + result <- go initDeps Object.empty + pure result + where + moduleCache :: Ref (Object Module) + moduleCache = unsafePerformEffect (Ref.new Object.empty) + + putModule :: String -> Module -> Effect Unit + putModule a b = Ref.modify_ (Object.insert a b) moduleCache + + getModule :: String -> Effect (Maybe Module) + getModule a = Object.lookup a <$> Ref.read moduleCache + + load :: Dependency -> ExceptT String (ContT Unit Effect) Module + load { name, path } = do + cached <- liftEffect $ getModule name + case cached of + Just mod -> pure mod + Nothing -> do + src <- JS <$> API.get (rootPath <> "/" <> path) + let mod = modFn { name, path, deps: parseDeps name src, src } + liftEffect $ putModule name mod + pure mod + + go :: Array Dependency -> Object JS -> ExceptT String (ContT Unit Effect) (Object JS) + go deps accum = do + modules <- parTraverse load deps + let + accum' = + modules + # map (\{ name, src } -> Tuple name src) + # Object.fromFoldable + # Object.union accum + more = + modules + # bindFlipped _.deps + # Array.nubBy (comparing _.name) + case more of + [] -> pure accum' + _ -> go more accum' diff --git a/src/Try/Types.purs b/src/Try/Types.purs index 35f01789..a85d2e8b 100644 --- a/src/Try/Types.purs +++ b/src/Try/Types.purs @@ -3,7 +3,10 @@ module Try.Types ) where import Data.Newtype (class Newtype) +import Foreign.Class (class Encode) newtype JS = JS String derive instance newtypeJS :: Newtype JS _ + +derive newtype instance encodeJS :: Encode JS From 052354532191b2d8f6a17a6ccf418e4a1ab05490 Mon Sep 17 00:00:00 2001 From: Nathan Faubion Date: Sun, 11 Nov 2018 10:25:54 -0800 Subject: [PATCH 03/12] Cleanup --- js/index.js | 47 +++++++++++++++++++++++++++++++-------------- src/Main.purs | 6 ++++-- src/Try/Loader.purs | 3 +-- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/js/index.js b/js/index.js index 8fab0433..aff3f43c 100644 --- a/js/index.js +++ b/js/index.js @@ -5772,8 +5772,8 @@ var PS = {}; }); }); }; - return function ($34) { - return Data_Array.mapMaybe(go)(Data_String_Common.split("\x0a")(Data_Newtype.unwrap(Try_Types.newtypeJS)($34))); + return function ($32) { + return Data_Array.mapMaybe(go)(Data_String_Common.split("\x0a")(Data_Newtype.unwrap(Try_Types.newtypeJS)($32))); }; }; var makeLoader = function (modFn) { @@ -5805,7 +5805,7 @@ var PS = {}; }); }); }; - throw new Error("Failed pattern match at Try.Loader line 93, column 5 - line 99, column 17: " + [ v1.constructor.name ]); + throw new Error("Failed pattern match at Try.Loader line 92, column 5 - line 98, column 17: " + [ v1.constructor.name ]); }); }; var go = function (deps) { @@ -5828,9 +5828,7 @@ var PS = {}; }; return function (js) { var initDeps = parseDeps("")(js); - return Control_Bind.bind(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(go(initDeps)(Foreign_Object.empty))(function (v) { - return Control_Applicative.pure(Control_Monad_Except_Trans.applicativeExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(v); - }); + return go(initDeps)(Foreign_Object.empty); }; }; }; @@ -6457,8 +6455,7 @@ var PS = {}; exports["window"] = $foreign.window; })(PS["Web.HTML"] = PS["Web.HTML"] || {}); (function(exports) { - // Generated by purs version 0.12.0 - "use strict"; + "use strict"; var $foreign = PS["Main"]; var Control_Applicative = PS["Control.Applicative"]; var Control_Bind = PS["Control.Bind"]; @@ -6506,6 +6503,8 @@ var PS = {}; var setTextAreaContent = function (value) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery.setValue(value)); }; + + // | Navigate to the specified URL. var navigateTo = function (uri) { return Data_Functor["void"](Effect.functorEffect)(Control_Bind.bind(Effect.bindEffect)(Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.location))(Web_HTML_Location.setHref(uri))); }; @@ -6530,7 +6529,7 @@ var PS = {}; backend: backend }); }; - throw new Error("Failed pattern match at Main line 254, column 5 - line 258, column 40: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Main line 256, column 5 - line 260, column 40: " + [ v.constructor.name ]); }); }; }; @@ -6552,7 +6551,7 @@ var PS = {}; var v2 = Data_Functor.map(Effect.functorEffect)(Data_Maybe.fromMaybe(v1.mainGist))(Try_QueryString.getQueryStringMaybe("gist"))(); return loadFromGist(v2)(v1)(k)(); }; - throw new Error("Failed pattern match at Main line 266, column 3 - line 272, column 29: " + [ v.constructor.name ]); + throw new Error("Failed pattern match at Main line 268, column 3 - line 274, column 29: " + [ v.constructor.name ]); }; }; }; @@ -6566,6 +6565,8 @@ var PS = {}; }; var hideLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeOut); var getTextAreaContent = Data_Functor.map(Effect.functorEffect)(Data_Foldable.fold(Data_Foldable.foldableMaybe)(Data_Monoid.monoidString))(Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery_Extras.getValueMaybe)); + + // | Create a new Gist using the current content var publishNewGist = function (v) { return function __do() { var v1 = Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.confirm(Data_Foldable.intercalate(Data_Foldable.foldableArray)(Data_Monoid.monoidString)("\x0a")([ "Do you really want to publish this code as an anonymous Gist?", "", "Note: this code will be available to anyone with a link to the Gist." ])))(); @@ -6581,16 +6582,18 @@ var PS = {}; if (v3 instanceof Data_Either.Right) { return Try_QueryString.setQueryStrings(Data_Semigroup.append(Foreign_Object.semigroupObject(Data_Semigroup.semigroupString))(Foreign_Object.singleton("gist")(v3.value0))(Foreign_Object.singleton("backend")(v.backend))); }; - throw new Error("Failed pattern match at Main line 295, column 7 - line 301, column 71: " + [ v3.constructor.name ]); + throw new Error("Failed pattern match at Main line 297, column 7 - line 303, column 71: " + [ v3.constructor.name ]); })(); })(); }; }; + + // | Execute the compiled code in a new iframe. var execute = function (js) { return function (sources) { return function (v) { var json = Foreign_Generic.encodeJSON(Foreign_Class.objectEncode(Try_Types.encodeJS))(Foreign_Object.insert("")(js)(sources)); - var scripts = Data_String_Common.joinWith("\x0a")([ "var load = PSRequireShim(" + (json + ");"), "load(\"\").main();" ]); + var scripts = Data_String_Common.joinWith("\x0a")([ "(function() {", " var module = PSRequireShim(" + (json + ")('');"), " module.main && module.main();", "})();" ]); var html = Data_String_Common.joinWith("\x0a")([ "", "", " ", " ", " ", " ", " Try PureScript!", " ", " ", v.extra_styling, " ", " ", v.extra_body, " ", "" ]); return function __do() { var v1 = JQuery.select("#column2")(); @@ -6599,6 +6602,8 @@ var PS = {}; }; }; }; + + // | Display plain text in the right hand column. var displayPlainText = function (s) { return function __do() { var v = JQuery.select("#column2")(); @@ -6611,6 +6616,8 @@ var PS = {}; }; }; var displayLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeIn); + + // | Display a list of errors in the right hand column. var displayErrors = function (errs) { return function __do() { var v = JQuery.select("#column2")(); @@ -6635,6 +6642,8 @@ var PS = {}; var clearAnnotations = function () { return $foreign.setAnnotations([ ]); }; + + // | Compile the current code and execute it. var compile = function (v) { return function __do() { var v1 = getTextAreaContent(); @@ -6719,11 +6728,15 @@ var PS = {}; })(); }; }; + + // | Update the view mode based on the menu selection var changeViewMode = function (viewMode) { return Data_Foldable.for_(Effect.applicativeEffect)(Data_Foldable.foldableMaybe)(viewMode)(function (viewMode_) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#editor_view"))(JQuery.setAttr("data-view-mode")(viewMode_)); }); }; + + // | Read query string options and update the state accordingly var loadOptions = function (bc) { return function __do() { var v = Try_QueryString.getQueryStringMaybe("view")(); @@ -6756,9 +6769,11 @@ var PS = {}; if (v3 instanceof Data_Maybe.Nothing) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select(".view_gist_li"))(JQuery.hide)(); }; - throw new Error("Failed pattern match at Main line 330, column 3 - line 332, column 61: " + [ v3.constructor.name ]); + throw new Error("Failed pattern match at Main line 332, column 3 - line 334, column 61: " + [ v3.constructor.name ]); }; }; + + // | Cache the current code in the session state var cacheCurrentCode = function (v) { return function __do() { var v1 = Try_QueryString.getQueryStringMaybe("session")(); @@ -6772,9 +6787,11 @@ var PS = {}; if (v1 instanceof Data_Maybe.Nothing) { return Effect_Console.error("No session ID")(); }; - throw new Error("Failed pattern match at Main line 278, column 3 - line 284, column 1: " + [ v1.constructor.name ]); + throw new Error("Failed pattern match at Main line 280, column 3 - line 286, column 1: " + [ v1.constructor.name ]); }; }; + + // | Setup event listeners for the backend dropdown menu. var setupBackendMenu = function (v) { return function __do() { Control_Bind.bind(Effect.bindEffect)(JQuery.select("#backend_" + v.backend))(JQuery.attr({ @@ -6799,6 +6816,8 @@ var PS = {}; }))(); }; }; + + // | Setup the editor component and some event handlers. var setupEditor = function (v) { return function __do() { loadOptions(v.backend)(); diff --git a/src/Main.purs b/src/Main.purs index eb899909..248c0ccf 100644 --- a/src/Main.purs +++ b/src/Main.purs @@ -209,8 +209,10 @@ execute js sources bc@(BackendConfig backend) = do json = encodeJSON (Object.insert "" js sources) scripts = joinWith "\n" - [ "var load = PSRequireShim(" <> json <> ");" - , """load("").main();""" + [ "(function() {" + , " var module = PSRequireShim(" <> json <> ")('');" + , " module.main && module.main();" + , "})();" ] column2 <- JQuery.select "#column2" diff --git a/src/Try/Loader.purs b/src/Try/Loader.purs index 72d2b22b..18cb5e44 100644 --- a/src/Try/Loader.purs +++ b/src/Try/Loader.purs @@ -75,8 +75,7 @@ runLoader (Loader k) = k makeLoader :: (Module -> Module) -> String -> Loader makeLoader modFn rootPath = Loader \js -> do let initDeps = parseDeps "" js - result <- go initDeps Object.empty - pure result + go initDeps Object.empty where moduleCache :: Ref (Object Module) moduleCache = unsafePerformEffect (Ref.new Object.empty) From 1e8c6b53e06e1006ea502002a97b24debda9c8db Mon Sep 17 00:00:00 2001 From: Nathan Faubion Date: Sun, 11 Nov 2018 11:18:23 -0800 Subject: [PATCH 04/12] Small tweak to 'go' --- js/index.js | 65 +++++++++++++++------------------------------ src/Try/Loader.purs | 20 ++++++-------- 2 files changed, 29 insertions(+), 56 deletions(-) diff --git a/js/index.js b/js/index.js index aff3f43c..627a2e3b 100644 --- a/js/index.js +++ b/js/index.js @@ -5772,8 +5772,8 @@ var PS = {}; }); }); }; - return function ($32) { - return Data_Array.mapMaybe(go)(Data_String_Common.split("\x0a")(Data_Newtype.unwrap(Try_Types.newtypeJS)($32))); + return function ($34) { + return Data_Array.mapMaybe(go)(Data_String_Common.split("\x0a")(Data_Newtype.unwrap(Try_Types.newtypeJS)($34))); }; }; var makeLoader = function (modFn) { @@ -5805,30 +5805,28 @@ var PS = {}; }); }); }; - throw new Error("Failed pattern match at Try.Loader line 92, column 5 - line 98, column 17: " + [ v1.constructor.name ]); + throw new Error("Failed pattern match at Try.Loader line 90, column 5 - line 96, column 17: " + [ v1.constructor.name ]); }); }; - var go = function (deps) { - return function (accum) { - return Control_Bind.bind(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(Control_Parallel.parTraverse(Control_Parallel_Class.monadParExceptT(Control_Parallel_Class.monadParParCont(Effect_Class.monadEffectEffect)))(Data_Traversable.traversableArray)(load)(deps))(function (v) { - var more = Data_Array.nubBy(Data_Ord.comparing(Data_Ord.ordString)(function (v1) { - return v1.name; - }))(Control_Bind.bindFlipped(Control_Bind.bindArray)(function (v1) { - return v1.deps; - })(v)); - var accum$prime = Foreign_Object.union(accum)(Foreign_Object.fromFoldable(Data_Foldable.foldableArray)(Data_Functor.map(Data_Functor.functorArray)(function (v1) { - return new Data_Tuple.Tuple(v1.name, v1.src); - })(v))); - if (more.length === 0) { - return Control_Applicative.pure(Control_Monad_Except_Trans.applicativeExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(accum$prime); - }; - return go(more)(accum$prime); + var go = function (accum) { + return function (v) { + if (v.length === 0) { + return Control_Applicative.pure(Control_Monad_Except_Trans.applicativeExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(accum); + }; + return Control_Bind.bind(Control_Monad_Except_Trans.bindExceptT(Control_Monad_Cont_Trans.monadContT(Effect.monadEffect)))(Control_Parallel.parTraverse(Control_Parallel_Class.monadParExceptT(Control_Parallel_Class.monadParParCont(Effect_Class.monadEffectEffect)))(Data_Traversable.traversableArray)(load)(v))(function (v1) { + var accum$prime = Foreign_Object.union(accum)(Foreign_Object.fromFoldable(Data_Foldable.foldableArray)(Data_Functor.map(Data_Functor.functorArray)(function (v2) { + return new Data_Tuple.Tuple(v2.name, v2.src); + })(v1))); + return go(accum$prime)(Data_Array.nubBy(Data_Ord.comparing(Data_Ord.ordString)(function (v2) { + return v2.name; + }))(Control_Bind.bindFlipped(Control_Bind.bindArray)(function (v2) { + return v2.deps; + })(v1))); }); }; }; - return function (js) { - var initDeps = parseDeps("")(js); - return go(initDeps)(Foreign_Object.empty); + return function ($35) { + return go(Foreign_Object.empty)(parseDeps("")($35)); }; }; }; @@ -6455,7 +6453,8 @@ var PS = {}; exports["window"] = $foreign.window; })(PS["Web.HTML"] = PS["Web.HTML"] || {}); (function(exports) { - "use strict"; + // Generated by purs version 0.12.0 + "use strict"; var $foreign = PS["Main"]; var Control_Applicative = PS["Control.Applicative"]; var Control_Bind = PS["Control.Bind"]; @@ -6503,8 +6502,6 @@ var PS = {}; var setTextAreaContent = function (value) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery.setValue(value)); }; - - // | Navigate to the specified URL. var navigateTo = function (uri) { return Data_Functor["void"](Effect.functorEffect)(Control_Bind.bind(Effect.bindEffect)(Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.location))(Web_HTML_Location.setHref(uri))); }; @@ -6565,8 +6562,6 @@ var PS = {}; }; var hideLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeOut); var getTextAreaContent = Data_Functor.map(Effect.functorEffect)(Data_Foldable.fold(Data_Foldable.foldableMaybe)(Data_Monoid.monoidString))(Control_Bind.bind(Effect.bindEffect)(JQuery.select("#code_textarea"))(JQuery_Extras.getValueMaybe)); - - // | Create a new Gist using the current content var publishNewGist = function (v) { return function __do() { var v1 = Control_Bind.bind(Effect.bindEffect)(Web_HTML.window)(Web_HTML_Window.confirm(Data_Foldable.intercalate(Data_Foldable.foldableArray)(Data_Monoid.monoidString)("\x0a")([ "Do you really want to publish this code as an anonymous Gist?", "", "Note: this code will be available to anyone with a link to the Gist." ])))(); @@ -6587,8 +6582,6 @@ var PS = {}; })(); }; }; - - // | Execute the compiled code in a new iframe. var execute = function (js) { return function (sources) { return function (v) { @@ -6602,8 +6595,6 @@ var PS = {}; }; }; }; - - // | Display plain text in the right hand column. var displayPlainText = function (s) { return function __do() { var v = JQuery.select("#column2")(); @@ -6616,8 +6607,6 @@ var PS = {}; }; }; var displayLoadingMessage = Control_Bind.bind(Effect.bindEffect)(JQuery.select("#loading"))(JQuery_Extras.fadeIn); - - // | Display a list of errors in the right hand column. var displayErrors = function (errs) { return function __do() { var v = JQuery.select("#column2")(); @@ -6642,8 +6631,6 @@ var PS = {}; var clearAnnotations = function () { return $foreign.setAnnotations([ ]); }; - - // | Compile the current code and execute it. var compile = function (v) { return function __do() { var v1 = getTextAreaContent(); @@ -6728,15 +6715,11 @@ var PS = {}; })(); }; }; - - // | Update the view mode based on the menu selection var changeViewMode = function (viewMode) { return Data_Foldable.for_(Effect.applicativeEffect)(Data_Foldable.foldableMaybe)(viewMode)(function (viewMode_) { return Control_Bind.bind(Effect.bindEffect)(JQuery.select("#editor_view"))(JQuery.setAttr("data-view-mode")(viewMode_)); }); }; - - // | Read query string options and update the state accordingly var loadOptions = function (bc) { return function __do() { var v = Try_QueryString.getQueryStringMaybe("view")(); @@ -6772,8 +6755,6 @@ var PS = {}; throw new Error("Failed pattern match at Main line 332, column 3 - line 334, column 61: " + [ v3.constructor.name ]); }; }; - - // | Cache the current code in the session state var cacheCurrentCode = function (v) { return function __do() { var v1 = Try_QueryString.getQueryStringMaybe("session")(); @@ -6790,8 +6771,6 @@ var PS = {}; throw new Error("Failed pattern match at Main line 280, column 3 - line 286, column 1: " + [ v1.constructor.name ]); }; }; - - // | Setup event listeners for the backend dropdown menu. var setupBackendMenu = function (v) { return function __do() { Control_Bind.bind(Effect.bindEffect)(JQuery.select("#backend_" + v.backend))(JQuery.attr({ @@ -6816,8 +6795,6 @@ var PS = {}; }))(); }; }; - - // | Setup the editor component and some event handlers. var setupEditor = function (v) { return function __do() { loadOptions(v.backend)(); diff --git a/src/Try/Loader.purs b/src/Try/Loader.purs index 18cb5e44..d0d66fa4 100644 --- a/src/Try/Loader.purs +++ b/src/Try/Loader.purs @@ -73,9 +73,7 @@ runLoader :: Loader -> JS -> ExceptT String (ContT Unit Effect) (Object JS) runLoader (Loader k) = k makeLoader :: (Module -> Module) -> String -> Loader -makeLoader modFn rootPath = Loader \js -> do - let initDeps = parseDeps "" js - go initDeps Object.empty +makeLoader modFn rootPath = Loader (go Object.empty <<< parseDeps "") where moduleCache :: Ref (Object Module) moduleCache = unsafePerformEffect (Ref.new Object.empty) @@ -97,8 +95,9 @@ makeLoader modFn rootPath = Loader \js -> do liftEffect $ putModule name mod pure mod - go :: Array Dependency -> Object JS -> ExceptT String (ContT Unit Effect) (Object JS) - go deps accum = do + go :: Object JS -> Array Dependency -> ExceptT String (ContT Unit Effect) (Object JS) + go accum [] = pure accum + go accum deps = do modules <- parTraverse load deps let accum' = @@ -106,10 +105,7 @@ makeLoader modFn rootPath = Loader \js -> do # map (\{ name, src } -> Tuple name src) # Object.fromFoldable # Object.union accum - more = - modules - # bindFlipped _.deps - # Array.nubBy (comparing _.name) - case more of - [] -> pure accum' - _ -> go more accum' + modules + # bindFlipped _.deps + # Array.nubBy (comparing _.name) + # go accum' From 0e6f8b2fcb792a4d0788f3d355f6c9217f926994 Mon Sep 17 00:00:00 2001 From: Nathan Faubion Date: Wed, 14 Nov 2018 19:04:09 -0800 Subject: [PATCH 05/12] Add require shims, sandboxed frame --- frame.html | 62 +++++++ index.html | 28 +-- js/index.js | 401 +++++++++++++++++++++++++----------------- js/ps-require-shim.js | 24 --- src/Main.purs | 52 ++---- src/Try/Backend.purs | 12 +- src/Try/Loader.purs | 71 +++++--- src/Try/Shim.purs | 47 +++++ 8 files changed, 420 insertions(+), 277 deletions(-) create mode 100644 frame.html delete mode 100644 js/ps-require-shim.js create mode 100644 src/Try/Shim.purs diff --git a/frame.html b/frame.html new file mode 100644 index 00000000..b3e59c7a --- /dev/null +++ b/frame.html @@ -0,0 +1,62 @@ + + + + Try PureScript! + + + + + + +
+ + + diff --git a/index.html b/index.html index 8e97044d..5d48f3ce 100644 --- a/index.html +++ b/index.html @@ -188,30 +188,20 @@ })(marker)); } - function setupIFrame($ctr, html, js) { - var $iframe = $('