├── .README_assets ├── GoL.gif ├── fib.gif ├── firstclass.png ├── hello.gif └── help.gif ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── docs ├── egui_template.js ├── egui_template_bg.wasm ├── hompy.js ├── hompy_bg.wasm └── index.html ├── examples ├── GoL.zac ├── fib.zac ├── hello.zac └── help.zac ├── src ├── interp.rs ├── lib.rs ├── main.rs ├── parser.rs ├── reassemble.rs └── wrapping.rs ├── syntax_highlighting └── zac.vim └── wondering /.README_assets/GoL.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet/Zac/1515668b08046e5e2c8d22e45aa8a3af3d24fb2e/.README_assets/GoL.gif -------------------------------------------------------------------------------- /.README_assets/fib.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet/Zac/1515668b08046e5e2c8d22e45aa8a3af3d24fb2e/.README_assets/fib.gif -------------------------------------------------------------------------------- /.README_assets/firstclass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet/Zac/1515668b08046e5e2c8d22e45aa8a3af3d24fb2e/.README_assets/firstclass.png -------------------------------------------------------------------------------- /.README_assets/hello.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet/Zac/1515668b08046e5e2c8d22e45aa8a3af3d24fb2e/.README_assets/hello.gif -------------------------------------------------------------------------------- /.README_assets/help.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet/Zac/1515668b08046e5e2c8d22e45aa8a3af3d24fb2e/.README_assets/help.gif -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "0.7.18" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "anyhow" 16 | version = "1.0.56" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" 19 | 20 | [[package]] 21 | name = "arrayvec" 22 | version = "0.5.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 25 | 26 | [[package]] 27 | name = "bincode" 28 | version = "1.3.3" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 31 | dependencies = [ 32 | "serde", 33 | ] 34 | 35 | [[package]] 36 | name = "cfg-if" 37 | version = "1.0.0" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 40 | 41 | [[package]] 42 | name = "dyn-clone" 43 | version = "1.0.5" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" 46 | 47 | [[package]] 48 | name = "dyn_partial_eq" 49 | version = "0.1.2" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "a07039d197226c4b9a3810c4f165328fb4e715258a4b8584f143d38e9de04301" 52 | dependencies = [ 53 | "dyn_partial_eq_derive", 54 | ] 55 | 56 | [[package]] 57 | name = "dyn_partial_eq_derive" 58 | version = "0.1.2" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "0e217c6c1435ebf9b88662354589d339192b8eaf506edd22951e75e045c8e8bd" 61 | dependencies = [ 62 | "quote", 63 | "syn", 64 | ] 65 | 66 | [[package]] 67 | name = "either" 68 | version = "1.6.1" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 71 | 72 | [[package]] 73 | name = "fst" 74 | version = "0.4.7" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" 77 | 78 | [[package]] 79 | name = "hyphenation" 80 | version = "0.8.4" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "bcf4dd4c44ae85155502a52c48739c8a48185d1449fff1963cffee63c28a50f0" 83 | dependencies = [ 84 | "bincode", 85 | "fst", 86 | "hyphenation_commons", 87 | "pocket-resources", 88 | "serde", 89 | ] 90 | 91 | [[package]] 92 | name = "hyphenation_commons" 93 | version = "0.8.4" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "5febe7a2ade5c7d98eb8b75f946c046b335324b06a14ea0998271504134c05bf" 96 | dependencies = [ 97 | "fst", 98 | "serde", 99 | ] 100 | 101 | [[package]] 102 | name = "itertools" 103 | version = "0.10.3" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" 106 | dependencies = [ 107 | "either", 108 | ] 109 | 110 | [[package]] 111 | name = "lazy_static" 112 | version = "1.4.0" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 115 | 116 | [[package]] 117 | name = "litrs" 118 | version = "0.2.3" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "f9275e0933cf8bb20f008924c0cb07a0692fe54d8064996520bf998de9eb79aa" 121 | dependencies = [ 122 | "proc-macro2", 123 | ] 124 | 125 | [[package]] 126 | name = "log" 127 | version = "0.4.16" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" 130 | dependencies = [ 131 | "cfg-if", 132 | ] 133 | 134 | [[package]] 135 | name = "memchr" 136 | version = "2.4.1" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" 139 | 140 | [[package]] 141 | name = "peg" 142 | version = "0.8.0" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "af728fe826811af3b38c37e93de6d104485953ea373d656eebae53d6987fcd2c" 145 | dependencies = [ 146 | "peg-macros", 147 | "peg-runtime", 148 | ] 149 | 150 | [[package]] 151 | name = "peg-macros" 152 | version = "0.8.0" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "4536be147b770b824895cbad934fccce8e49f14b4c4946eaa46a6e4a12fcdc16" 155 | dependencies = [ 156 | "peg-runtime", 157 | "proc-macro2", 158 | "quote", 159 | ] 160 | 161 | [[package]] 162 | name = "peg-runtime" 163 | version = "0.8.0" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "f9b0efd3ba03c3a409d44d60425f279ec442bcf0b9e63ff4e410da31c8b0f69f" 166 | 167 | [[package]] 168 | name = "pocket-resources" 169 | version = "0.3.2" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "c135f38778ad324d9e9ee68690bac2c1a51f340fdf96ca13e2ab3914eb2e51d8" 172 | 173 | [[package]] 174 | name = "pretty" 175 | version = "0.11.2" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "29afd15870fab34b2a8884481a68f052b3d720cfb29666d7ae0ac2a42ea10289" 178 | dependencies = [ 179 | "arrayvec", 180 | "log", 181 | "typed-arena", 182 | "unicode-segmentation", 183 | ] 184 | 185 | [[package]] 186 | name = "proc-macro2" 187 | version = "1.0.36" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" 190 | dependencies = [ 191 | "unicode-xid", 192 | ] 193 | 194 | [[package]] 195 | name = "quote" 196 | version = "1.0.17" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58" 199 | dependencies = [ 200 | "proc-macro2", 201 | ] 202 | 203 | [[package]] 204 | name = "regex" 205 | version = "1.5.5" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" 208 | dependencies = [ 209 | "aho-corasick", 210 | "memchr", 211 | "regex-syntax", 212 | ] 213 | 214 | [[package]] 215 | name = "regex-syntax" 216 | version = "0.6.25" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 219 | 220 | [[package]] 221 | name = "serde" 222 | version = "1.0.136" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" 225 | dependencies = [ 226 | "serde_derive", 227 | ] 228 | 229 | [[package]] 230 | name = "serde_derive" 231 | version = "1.0.136" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" 234 | dependencies = [ 235 | "proc-macro2", 236 | "quote", 237 | "syn", 238 | ] 239 | 240 | [[package]] 241 | name = "smawk" 242 | version = "0.3.1" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" 245 | 246 | [[package]] 247 | name = "syn" 248 | version = "1.0.90" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "704df27628939572cd88d33f171cd6f896f4eaca85252c6e0a72d8d8287ee86f" 251 | dependencies = [ 252 | "proc-macro2", 253 | "quote", 254 | "unicode-xid", 255 | ] 256 | 257 | [[package]] 258 | name = "textwrap" 259 | version = "0.15.0" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" 262 | dependencies = [ 263 | "hyphenation", 264 | "smawk", 265 | "unicode-linebreak", 266 | "unicode-width", 267 | ] 268 | 269 | [[package]] 270 | name = "typed-arena" 271 | version = "2.0.1" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" 274 | 275 | [[package]] 276 | name = "unicode-linebreak" 277 | version = "0.1.2" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "3a52dcaab0c48d931f7cc8ef826fa51690a08e1ea55117ef26f89864f532383f" 280 | dependencies = [ 281 | "regex", 282 | ] 283 | 284 | [[package]] 285 | name = "unicode-segmentation" 286 | version = "1.9.0" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" 289 | 290 | [[package]] 291 | name = "unicode-width" 292 | version = "0.1.9" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 295 | 296 | [[package]] 297 | name = "unicode-xid" 298 | version = "0.2.2" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 301 | 302 | [[package]] 303 | name = "zac" 304 | version = "0.1.0" 305 | dependencies = [ 306 | "anyhow", 307 | "dyn-clone", 308 | "dyn_partial_eq", 309 | "hyphenation", 310 | "itertools", 311 | "lazy_static", 312 | "litrs", 313 | "peg", 314 | "pretty", 315 | "textwrap", 316 | ] 317 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "zac" 3 | version = "0.1.0" 4 | edition = "2021" 5 | description = "Interactive scripting language where you can edit the comments" 6 | license = "Free" 7 | homepage = "https://github.com/sumeet/Zac" 8 | repository = "https://github.com/sumeet/Zac" 9 | 10 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 11 | 12 | [lib] 13 | name = "zac_lib" 14 | path = "src/lib.rs" 15 | 16 | [[bin]] 17 | name = "zac" 18 | path = "src/main.rs" 19 | 20 | [dependencies] 21 | lazy_static = "*" 22 | peg = "*" 23 | anyhow = "*" 24 | itertools = "*" 25 | dyn-clone = "*" 26 | dyn_partial_eq = "*" 27 | pretty = "*" 28 | textwrap = {version = "*", features = ["hyphenation"]} 29 | hyphenation = "*" 30 | litrs = "*" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Zac Programming Language 2 | An interactive scripting language where you can read and modify code comments as if they were regular strings. Add and view text-based visualizations and debugging information inside your source code file. 3 | 4 | ### [Try it in your browser right away](https://sumeet.github.io/Zac/) 5 | The experience is better locally though, read on! 6 | 7 | ![GoL](.README_assets/GoL.gif) 8 | 9 | Since this is an interactive editor, the best examples are moving use cases. 10 | 11 | #### Built-in Help 12 | ![help](.README_assets/help.gif) 13 | 14 | #### Workbook style examples that don't go out of sync 15 | ![fib](.README_assets/fib.gif) 16 | 17 | ### Cargo Install Instructions 18 | Make sure you have the [Cargo package manager](https://crates.io/) with a recent nightly Rust, and from inside this 19 | directory: 20 | ```console 21 | cargo install --path . 22 | ``` 23 | 24 | ### How To Run 25 | As an example, open [examples/hello.zac](examples/hello.zac) in your editor. Then, run (preferably through your editor) 26 | 27 | ```console 28 | zac examples/hello.zac 29 | ``` 30 | 31 | (or if you're a Rust coder) 32 | 33 | ```console 34 | cargo build --release 35 | target/release/zac examples/hello.zac 36 | ``` 37 | 38 | ![hello](.README_assets/hello.gif) 39 | 40 | ### More Examples 41 | - [GoL.zac](examples/GoL.zac) 42 | - [fib.zac](examples/fib.zac) 43 | - [help.zac](examples/help.zac) 44 | - [the in-browser version](https://sumeet.github.io/Zac/) 45 | 46 | #### It's Better With Syntax Highlighting 47 | If you're using Vim, there's a [syntax file](syntax_highlighting/) in the repo. Put this in your `~/.vim/syntax` directory, or `~/.config/nvim/syntax` if you're using Neovim, and follow the instructions at the top of the file. 48 | 49 | #### Interactive Editing 50 | It's highly recommended that you save the file from inside of your editor instead of changing windows. Zac is meant to be used like Gofmt or Rustfmt, run every time you save your file. 51 | 52 | In Vim, you can use the following command to save your file: 53 | ```vim 54 | :map \t :w\|:!zac %:e 55 | ``` 56 | 57 | ### Zac Language Overview 58 | 59 | You'll have a better time getting a feel of how the language works from looking at and running examples than from reading detailed documentation. Other than comment modification, Zac is a familiar-looking scripting language. 60 | 61 | Comments come in two flavors, anonymous and named. 62 | 63 | ```js 64 | // This is an anonymous comment because it doesn't have a #identifier as 65 | // the first line. 66 | // 67 | // This cannot be referenced or modified from within the code. 68 | 69 | let #changeme = // some string 70 | 71 | // #changeme 72 | // This is a comment with the name #changeme. 73 | // 74 | // In this program, it is modified twice, once above and once below 75 | // using the `let` expression. 76 | // 77 | // After running this program, this comment will instead contain: 78 | // // some string another string 79 | 80 | let another_string = // another string 81 | let #changeme = cat(#changeme, chr(32), another_string) 82 | 83 | // Named comments can be changed before and/or after they appear in the source code. Zac will throw 84 | // an error if there are two comments in a program with the same name. 85 | ``` 86 | 87 | As of now, there is no specific syntax for string literals, if you need a string literal, you can make a comment. 88 | 89 | ### Status 90 | This is a proof-of-concept I made in the first [Lang Jam](langjam/langjam), a 2-day competition to design a programming language around the theme `first-class comments`. 91 | 92 | Submitted to the contest under the team name SOLDIER. 93 | 94 | 95 | -------------------------------------------------------------------------------- /docs/egui_template.js: -------------------------------------------------------------------------------- 1 | let wasm_bindgen; 2 | (function() { 3 | const __exports = {}; 4 | let wasm; 5 | 6 | const heap = new Array(32).fill(undefined); 7 | 8 | heap.push(undefined, null, true, false); 9 | 10 | function getObject(idx) { return heap[idx]; } 11 | 12 | let heap_next = heap.length; 13 | 14 | function dropObject(idx) { 15 | if (idx < 36) return; 16 | heap[idx] = heap_next; 17 | heap_next = idx; 18 | } 19 | 20 | function takeObject(idx) { 21 | const ret = getObject(idx); 22 | dropObject(idx); 23 | return ret; 24 | } 25 | 26 | let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); 27 | 28 | cachedTextDecoder.decode(); 29 | 30 | let cachegetUint8Memory0 = null; 31 | function getUint8Memory0() { 32 | if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { 33 | cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); 34 | } 35 | return cachegetUint8Memory0; 36 | } 37 | 38 | function getStringFromWasm0(ptr, len) { 39 | return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); 40 | } 41 | 42 | function addHeapObject(obj) { 43 | if (heap_next === heap.length) heap.push(heap.length + 1); 44 | const idx = heap_next; 45 | heap_next = heap[idx]; 46 | 47 | heap[idx] = obj; 48 | return idx; 49 | } 50 | 51 | function isLikeNone(x) { 52 | return x === undefined || x === null; 53 | } 54 | 55 | let cachegetFloat64Memory0 = null; 56 | function getFloat64Memory0() { 57 | if (cachegetFloat64Memory0 === null || cachegetFloat64Memory0.buffer !== wasm.memory.buffer) { 58 | cachegetFloat64Memory0 = new Float64Array(wasm.memory.buffer); 59 | } 60 | return cachegetFloat64Memory0; 61 | } 62 | 63 | let cachegetInt32Memory0 = null; 64 | function getInt32Memory0() { 65 | if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) { 66 | cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer); 67 | } 68 | return cachegetInt32Memory0; 69 | } 70 | 71 | function debugString(val) { 72 | // primitive types 73 | const type = typeof val; 74 | if (type == 'number' || type == 'boolean' || val == null) { 75 | return `${val}`; 76 | } 77 | if (type == 'string') { 78 | return `"${val}"`; 79 | } 80 | if (type == 'symbol') { 81 | const description = val.description; 82 | if (description == null) { 83 | return 'Symbol'; 84 | } else { 85 | return `Symbol(${description})`; 86 | } 87 | } 88 | if (type == 'function') { 89 | const name = val.name; 90 | if (typeof name == 'string' && name.length > 0) { 91 | return `Function(${name})`; 92 | } else { 93 | return 'Function'; 94 | } 95 | } 96 | // objects 97 | if (Array.isArray(val)) { 98 | const length = val.length; 99 | let debug = '['; 100 | if (length > 0) { 101 | debug += debugString(val[0]); 102 | } 103 | for(let i = 1; i < length; i++) { 104 | debug += ', ' + debugString(val[i]); 105 | } 106 | debug += ']'; 107 | return debug; 108 | } 109 | // Test for built-in 110 | const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); 111 | let className; 112 | if (builtInMatches.length > 1) { 113 | className = builtInMatches[1]; 114 | } else { 115 | // Failed to match the standard '[object ClassName]' 116 | return toString.call(val); 117 | } 118 | if (className == 'Object') { 119 | // we're a user defined class or Object 120 | // JSON.stringify avoids problems with cycles, and is generally much 121 | // easier than looping through ownProperties of `val`. 122 | try { 123 | return 'Object(' + JSON.stringify(val) + ')'; 124 | } catch (_) { 125 | return 'Object'; 126 | } 127 | } 128 | // errors 129 | if (val instanceof Error) { 130 | return `${val.name}: ${val.message}\n${val.stack}`; 131 | } 132 | // TODO we could test for more things here, like `Set`s and `Map`s. 133 | return className; 134 | } 135 | 136 | let WASM_VECTOR_LEN = 0; 137 | 138 | let cachedTextEncoder = new TextEncoder('utf-8'); 139 | 140 | const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' 141 | ? function (arg, view) { 142 | return cachedTextEncoder.encodeInto(arg, view); 143 | } 144 | : function (arg, view) { 145 | const buf = cachedTextEncoder.encode(arg); 146 | view.set(buf); 147 | return { 148 | read: arg.length, 149 | written: buf.length 150 | }; 151 | }); 152 | 153 | function passStringToWasm0(arg, malloc, realloc) { 154 | 155 | if (realloc === undefined) { 156 | const buf = cachedTextEncoder.encode(arg); 157 | const ptr = malloc(buf.length); 158 | getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); 159 | WASM_VECTOR_LEN = buf.length; 160 | return ptr; 161 | } 162 | 163 | let len = arg.length; 164 | let ptr = malloc(len); 165 | 166 | const mem = getUint8Memory0(); 167 | 168 | let offset = 0; 169 | 170 | for (; offset < len; offset++) { 171 | const code = arg.charCodeAt(offset); 172 | if (code > 0x7F) break; 173 | mem[ptr + offset] = code; 174 | } 175 | 176 | if (offset !== len) { 177 | if (offset !== 0) { 178 | arg = arg.slice(offset); 179 | } 180 | ptr = realloc(ptr, len, len = offset + arg.length * 3); 181 | const view = getUint8Memory0().subarray(ptr + offset, ptr + len); 182 | const ret = encodeString(arg, view); 183 | 184 | offset += ret.written; 185 | } 186 | 187 | WASM_VECTOR_LEN = offset; 188 | return ptr; 189 | } 190 | 191 | function makeMutClosure(arg0, arg1, dtor, f) { 192 | const state = { a: arg0, b: arg1, cnt: 1, dtor }; 193 | const real = (...args) => { 194 | // First up with a closure we increment the internal reference 195 | // count. This ensures that the Rust closure environment won't 196 | // be deallocated while we're invoking it. 197 | state.cnt++; 198 | const a = state.a; 199 | state.a = 0; 200 | try { 201 | return f(a, state.b, ...args); 202 | } finally { 203 | if (--state.cnt === 0) { 204 | wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); 205 | 206 | } else { 207 | state.a = a; 208 | } 209 | } 210 | }; 211 | real.original = state; 212 | 213 | return real; 214 | } 215 | function __wbg_adapter_24(arg0, arg1) { 216 | wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h22c17115b88d2e08(arg0, arg1); 217 | } 218 | 219 | function __wbg_adapter_27(arg0, arg1) { 220 | wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h133b6d54ce94df01(arg0, arg1); 221 | } 222 | 223 | function __wbg_adapter_30(arg0, arg1, arg2) { 224 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1680e6e40f9ff882(arg0, arg1, addHeapObject(arg2)); 225 | } 226 | 227 | function __wbg_adapter_33(arg0, arg1, arg2) { 228 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1680e6e40f9ff882(arg0, arg1, addHeapObject(arg2)); 229 | } 230 | 231 | function __wbg_adapter_36(arg0, arg1, arg2) { 232 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1680e6e40f9ff882(arg0, arg1, addHeapObject(arg2)); 233 | } 234 | 235 | function __wbg_adapter_39(arg0, arg1, arg2) { 236 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1680e6e40f9ff882(arg0, arg1, addHeapObject(arg2)); 237 | } 238 | 239 | function __wbg_adapter_42(arg0, arg1, arg2) { 240 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1680e6e40f9ff882(arg0, arg1, addHeapObject(arg2)); 241 | } 242 | 243 | function __wbg_adapter_45(arg0, arg1, arg2) { 244 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1680e6e40f9ff882(arg0, arg1, addHeapObject(arg2)); 245 | } 246 | 247 | function __wbg_adapter_48(arg0, arg1, arg2) { 248 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1680e6e40f9ff882(arg0, arg1, addHeapObject(arg2)); 249 | } 250 | 251 | function __wbg_adapter_51(arg0, arg1, arg2) { 252 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h604c9703d9f204b9(arg0, arg1, addHeapObject(arg2)); 253 | } 254 | 255 | /** 256 | * This is the entry-point for all the web-assembly. 257 | * This is called once from the HTML. 258 | * It loads the app, installs some callbacks, then returns. 259 | * You can add more callbacks like this if you want to call in to your code. 260 | * @param {string} canvas_id 261 | */ 262 | __exports.start = function(canvas_id) { 263 | var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 264 | var len0 = WASM_VECTOR_LEN; 265 | wasm.start(ptr0, len0); 266 | }; 267 | 268 | function getArrayU8FromWasm0(ptr, len) { 269 | return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); 270 | } 271 | 272 | function handleError(f, args) { 273 | try { 274 | return f.apply(this, args); 275 | } catch (e) { 276 | wasm.__wbindgen_exn_store(addHeapObject(e)); 277 | } 278 | } 279 | 280 | async function load(module, imports) { 281 | if (typeof Response === 'function' && module instanceof Response) { 282 | if (typeof WebAssembly.instantiateStreaming === 'function') { 283 | try { 284 | return await WebAssembly.instantiateStreaming(module, imports); 285 | 286 | } catch (e) { 287 | if (module.headers.get('Content-Type') != 'application/wasm') { 288 | console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); 289 | 290 | } else { 291 | throw e; 292 | } 293 | } 294 | } 295 | 296 | const bytes = await module.arrayBuffer(); 297 | return await WebAssembly.instantiate(bytes, imports); 298 | 299 | } else { 300 | const instance = await WebAssembly.instantiate(module, imports); 301 | 302 | if (instance instanceof WebAssembly.Instance) { 303 | return { instance, module }; 304 | 305 | } else { 306 | return instance; 307 | } 308 | } 309 | } 310 | 311 | async function init(input) { 312 | if (typeof input === 'undefined') { 313 | let src; 314 | if (typeof document === 'undefined') { 315 | src = location.href; 316 | } else { 317 | src = document.currentScript.src; 318 | } 319 | input = src.replace(/\.js$/, '_bg.wasm'); 320 | } 321 | const imports = {}; 322 | imports.wbg = {}; 323 | imports.wbg.__wbindgen_object_drop_ref = function(arg0) { 324 | takeObject(arg0); 325 | }; 326 | imports.wbg.__wbindgen_string_new = function(arg0, arg1) { 327 | var ret = getStringFromWasm0(arg0, arg1); 328 | return addHeapObject(ret); 329 | }; 330 | imports.wbg.__wbindgen_cb_drop = function(arg0) { 331 | const obj = takeObject(arg0).original; 332 | if (obj.cnt-- == 1) { 333 | obj.a = 0; 334 | return true; 335 | } 336 | var ret = false; 337 | return ret; 338 | }; 339 | imports.wbg.__wbg_instanceof_WebGl2RenderingContext_13e6354db7f49c18 = function(arg0) { 340 | var ret = getObject(arg0) instanceof WebGL2RenderingContext; 341 | return ret; 342 | }; 343 | imports.wbg.__wbg_drawingBufferWidth_ef285db57df0f893 = function(arg0) { 344 | var ret = getObject(arg0).drawingBufferWidth; 345 | return ret; 346 | }; 347 | imports.wbg.__wbg_drawingBufferHeight_a44c735d2f8ebc62 = function(arg0) { 348 | var ret = getObject(arg0).drawingBufferHeight; 349 | return ret; 350 | }; 351 | imports.wbg.__wbg_bufferData_9129d14b1f0de925 = function(arg0, arg1, arg2, arg3) { 352 | getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); 353 | }; 354 | imports.wbg.__wbg_texImage2D_c3b86a5e56a49764 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { 355 | getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); 356 | }, arguments) }; 357 | imports.wbg.__wbg_activeTexture_62fb1a120971f7d8 = function(arg0, arg1) { 358 | getObject(arg0).activeTexture(arg1 >>> 0); 359 | }; 360 | imports.wbg.__wbg_attachShader_8a9eaf84fe954e03 = function(arg0, arg1, arg2) { 361 | getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); 362 | }; 363 | imports.wbg.__wbg_bindBuffer_a1ad7b194007470b = function(arg0, arg1, arg2) { 364 | getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); 365 | }; 366 | imports.wbg.__wbg_bindTexture_a25575c0badfe44b = function(arg0, arg1, arg2) { 367 | getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); 368 | }; 369 | imports.wbg.__wbg_blendFunc_e1d63775ac2fdb5b = function(arg0, arg1, arg2) { 370 | getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); 371 | }; 372 | imports.wbg.__wbg_clear_7a7de3b0e9ae30c3 = function(arg0, arg1) { 373 | getObject(arg0).clear(arg1 >>> 0); 374 | }; 375 | imports.wbg.__wbg_clearColor_9b9649257ee72f16 = function(arg0, arg1, arg2, arg3, arg4) { 376 | getObject(arg0).clearColor(arg1, arg2, arg3, arg4); 377 | }; 378 | imports.wbg.__wbg_compileShader_69fd6c32a532c35a = function(arg0, arg1) { 379 | getObject(arg0).compileShader(getObject(arg1)); 380 | }; 381 | imports.wbg.__wbg_createBuffer_f277512b66ff156c = function(arg0) { 382 | var ret = getObject(arg0).createBuffer(); 383 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 384 | }; 385 | imports.wbg.__wbg_createProgram_6b17e2185bcf1673 = function(arg0) { 386 | var ret = getObject(arg0).createProgram(); 387 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 388 | }; 389 | imports.wbg.__wbg_createShader_5d6f7b01da5682e3 = function(arg0, arg1) { 390 | var ret = getObject(arg0).createShader(arg1 >>> 0); 391 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 392 | }; 393 | imports.wbg.__wbg_createTexture_42e03addb914d25f = function(arg0) { 394 | var ret = getObject(arg0).createTexture(); 395 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 396 | }; 397 | imports.wbg.__wbg_disable_ea9b2fd524e20bea = function(arg0, arg1) { 398 | getObject(arg0).disable(arg1 >>> 0); 399 | }; 400 | imports.wbg.__wbg_drawElements_fdc70c7e5299d334 = function(arg0, arg1, arg2, arg3, arg4) { 401 | getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); 402 | }; 403 | imports.wbg.__wbg_enable_f39af773aafb63f0 = function(arg0, arg1) { 404 | getObject(arg0).enable(arg1 >>> 0); 405 | }; 406 | imports.wbg.__wbg_enableVertexAttribArray_498ab84c1826a745 = function(arg0, arg1) { 407 | getObject(arg0).enableVertexAttribArray(arg1 >>> 0); 408 | }; 409 | imports.wbg.__wbg_getAttribLocation_241dd0e4c29138d2 = function(arg0, arg1, arg2, arg3) { 410 | var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 411 | return ret; 412 | }; 413 | imports.wbg.__wbg_getProgramInfoLog_8d7bd18699310151 = function(arg0, arg1, arg2) { 414 | var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); 415 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 416 | var len0 = WASM_VECTOR_LEN; 417 | getInt32Memory0()[arg0 / 4 + 1] = len0; 418 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 419 | }; 420 | imports.wbg.__wbg_getProgramParameter_3315a81c35911e56 = function(arg0, arg1, arg2) { 421 | var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); 422 | return addHeapObject(ret); 423 | }; 424 | imports.wbg.__wbg_getShaderInfoLog_c5dbc0816b0110fe = function(arg0, arg1, arg2) { 425 | var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); 426 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 427 | var len0 = WASM_VECTOR_LEN; 428 | getInt32Memory0()[arg0 / 4 + 1] = len0; 429 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 430 | }; 431 | imports.wbg.__wbg_getShaderParameter_7d75b4fa2fdd22b7 = function(arg0, arg1, arg2) { 432 | var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); 433 | return addHeapObject(ret); 434 | }; 435 | imports.wbg.__wbg_getUniformLocation_736e12e23e8350b7 = function(arg0, arg1, arg2, arg3) { 436 | var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 437 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 438 | }; 439 | imports.wbg.__wbg_linkProgram_b43539ddb67e7253 = function(arg0, arg1) { 440 | getObject(arg0).linkProgram(getObject(arg1)); 441 | }; 442 | imports.wbg.__wbg_pixelStorei_707a2760a4bb063f = function(arg0, arg1, arg2) { 443 | getObject(arg0).pixelStorei(arg1 >>> 0, arg2); 444 | }; 445 | imports.wbg.__wbg_scissor_ab029c7a9354d83d = function(arg0, arg1, arg2, arg3, arg4) { 446 | getObject(arg0).scissor(arg1, arg2, arg3, arg4); 447 | }; 448 | imports.wbg.__wbg_shaderSource_bd5f73d004d97e08 = function(arg0, arg1, arg2, arg3) { 449 | getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); 450 | }; 451 | imports.wbg.__wbg_texParameteri_e5284ef0c47b2a2e = function(arg0, arg1, arg2, arg3) { 452 | getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); 453 | }; 454 | imports.wbg.__wbg_uniform1i_0740fc72ca42db54 = function(arg0, arg1, arg2) { 455 | getObject(arg0).uniform1i(getObject(arg1), arg2); 456 | }; 457 | imports.wbg.__wbg_uniform2f_95c32de4f3ada8ef = function(arg0, arg1, arg2, arg3) { 458 | getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); 459 | }; 460 | imports.wbg.__wbg_useProgram_84fff09700844d7b = function(arg0, arg1) { 461 | getObject(arg0).useProgram(getObject(arg1)); 462 | }; 463 | imports.wbg.__wbg_vertexAttribPointer_a4ee272ddd79df3b = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { 464 | getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); 465 | }; 466 | imports.wbg.__wbg_viewport_3418ae7378baf8c5 = function(arg0, arg1, arg2, arg3, arg4) { 467 | getObject(arg0).viewport(arg1, arg2, arg3, arg4); 468 | }; 469 | imports.wbg.__wbg_instanceof_Window_11e25482011fc506 = function(arg0) { 470 | var ret = getObject(arg0) instanceof Window; 471 | return ret; 472 | }; 473 | imports.wbg.__wbg_document_5aff8cd83ef968f5 = function(arg0) { 474 | var ret = getObject(arg0).document; 475 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 476 | }; 477 | imports.wbg.__wbg_location_05eee59b82ccc208 = function(arg0) { 478 | var ret = getObject(arg0).location; 479 | return addHeapObject(ret); 480 | }; 481 | imports.wbg.__wbg_navigator_5c90643c2a2b6cda = function(arg0) { 482 | var ret = getObject(arg0).navigator; 483 | return addHeapObject(ret); 484 | }; 485 | imports.wbg.__wbg_innerWidth_8c5001da2fdd6a9e = function() { return handleError(function (arg0) { 486 | var ret = getObject(arg0).innerWidth; 487 | return addHeapObject(ret); 488 | }, arguments) }; 489 | imports.wbg.__wbg_innerHeight_03d3f1d9eb5f7034 = function() { return handleError(function (arg0) { 490 | var ret = getObject(arg0).innerHeight; 491 | return addHeapObject(ret); 492 | }, arguments) }; 493 | imports.wbg.__wbg_devicePixelRatio_d92cc4c40f432496 = function(arg0) { 494 | var ret = getObject(arg0).devicePixelRatio; 495 | return ret; 496 | }; 497 | imports.wbg.__wbg_performance_9d1ecf711183e1d5 = function(arg0) { 498 | var ret = getObject(arg0).performance; 499 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 500 | }; 501 | imports.wbg.__wbg_localStorage_b787eb9a4418c2b1 = function() { return handleError(function (arg0) { 502 | var ret = getObject(arg0).localStorage; 503 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 504 | }, arguments) }; 505 | imports.wbg.__wbg_matchMedia_dc4441d20b28fe10 = function() { return handleError(function (arg0, arg1, arg2) { 506 | var ret = getObject(arg0).matchMedia(getStringFromWasm0(arg1, arg2)); 507 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 508 | }, arguments) }; 509 | imports.wbg.__wbg_open_29812718979722ad = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 510 | var ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 511 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 512 | }, arguments) }; 513 | imports.wbg.__wbg_requestAnimationFrame_1fb079d39e1b8a26 = function() { return handleError(function (arg0, arg1) { 514 | var ret = getObject(arg0).requestAnimationFrame(getObject(arg1)); 515 | return ret; 516 | }, arguments) }; 517 | imports.wbg.__wbg_setInterval_d1fefc3dab46c6b6 = function() { return handleError(function (arg0, arg1, arg2) { 518 | var ret = getObject(arg0).setInterval(getObject(arg1), arg2); 519 | return ret; 520 | }, arguments) }; 521 | imports.wbg.__wbg_setTimeout_ce28a603906ebcbb = function() { return handleError(function (arg0, arg1, arg2) { 522 | var ret = getObject(arg0).setTimeout(getObject(arg1), arg2); 523 | return ret; 524 | }, arguments) }; 525 | imports.wbg.__wbg_clipboard_a304e2b83d0400c6 = function(arg0) { 526 | var ret = getObject(arg0).clipboard; 527 | return addHeapObject(ret); 528 | }; 529 | imports.wbg.__wbg_userAgent_9c09d784d0828a93 = function() { return handleError(function (arg0, arg1) { 530 | var ret = getObject(arg1).userAgent; 531 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 532 | var len0 = WASM_VECTOR_LEN; 533 | getInt32Memory0()[arg0 / 4 + 1] = len0; 534 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 535 | }, arguments) }; 536 | imports.wbg.__wbg_appendChild_6ed236bb79c198df = function() { return handleError(function (arg0, arg1) { 537 | var ret = getObject(arg0).appendChild(getObject(arg1)); 538 | return addHeapObject(ret); 539 | }, arguments) }; 540 | imports.wbg.__wbg_hash_1496bf468ca4142a = function() { return handleError(function (arg0, arg1) { 541 | var ret = getObject(arg1).hash; 542 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 543 | var len0 = WASM_VECTOR_LEN; 544 | getInt32Memory0()[arg0 / 4 + 1] = len0; 545 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 546 | }, arguments) }; 547 | imports.wbg.__wbg_getItem_1c87352132d0b415 = function() { return handleError(function (arg0, arg1, arg2, arg3) { 548 | var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3)); 549 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 550 | var len0 = WASM_VECTOR_LEN; 551 | getInt32Memory0()[arg0 / 4 + 1] = len0; 552 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 553 | }, arguments) }; 554 | imports.wbg.__wbg_setItem_103b1e46491c9b0e = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 555 | getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 556 | }, arguments) }; 557 | imports.wbg.__wbg_data_327df0625d734e68 = function(arg0, arg1) { 558 | var ret = getObject(arg1).data; 559 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 560 | var len0 = WASM_VECTOR_LEN; 561 | getInt32Memory0()[arg0 / 4 + 1] = len0; 562 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 563 | }; 564 | imports.wbg.__wbg_getPropertyValue_937a708feb88202f = function() { return handleError(function (arg0, arg1, arg2, arg3) { 565 | var ret = getObject(arg1).getPropertyValue(getStringFromWasm0(arg2, arg3)); 566 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 567 | var len0 = WASM_VECTOR_LEN; 568 | getInt32Memory0()[arg0 / 4 + 1] = len0; 569 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 570 | }, arguments) }; 571 | imports.wbg.__wbg_setProperty_dccccce3a52c26db = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 572 | getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 573 | }, arguments) }; 574 | imports.wbg.__wbg_deltaX_d726e0224b540206 = function(arg0) { 575 | var ret = getObject(arg0).deltaX; 576 | return ret; 577 | }; 578 | imports.wbg.__wbg_deltaY_7374d71292d30408 = function(arg0) { 579 | var ret = getObject(arg0).deltaY; 580 | return ret; 581 | }; 582 | imports.wbg.__wbg_deltaMode_01cad379615c05f4 = function(arg0) { 583 | var ret = getObject(arg0).deltaMode; 584 | return ret; 585 | }; 586 | imports.wbg.__wbg_clientX_5bbce6c078e1510e = function(arg0) { 587 | var ret = getObject(arg0).clientX; 588 | return ret; 589 | }; 590 | imports.wbg.__wbg_clientY_af6c4369507b54f0 = function(arg0) { 591 | var ret = getObject(arg0).clientY; 592 | return ret; 593 | }; 594 | imports.wbg.__wbg_ctrlKey_0b565cc670a6a49b = function(arg0) { 595 | var ret = getObject(arg0).ctrlKey; 596 | return ret; 597 | }; 598 | imports.wbg.__wbg_metaKey_a3c6ad6306b6adc3 = function(arg0) { 599 | var ret = getObject(arg0).metaKey; 600 | return ret; 601 | }; 602 | imports.wbg.__wbg_button_e27f6f9aa0a0c496 = function(arg0) { 603 | var ret = getObject(arg0).button; 604 | return ret; 605 | }; 606 | imports.wbg.__wbg_writeText_24e516a13acdea5a = function(arg0, arg1, arg2) { 607 | var ret = getObject(arg0).writeText(getStringFromWasm0(arg1, arg2)); 608 | return addHeapObject(ret); 609 | }; 610 | imports.wbg.__wbg_addEventListener_936431894dca4639 = function() { return handleError(function (arg0, arg1, arg2, arg3) { 611 | getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); 612 | }, arguments) }; 613 | imports.wbg.__wbg_matches_4b1ac237ba413336 = function(arg0) { 614 | var ret = getObject(arg0).matches; 615 | return ret; 616 | }; 617 | imports.wbg.__wbindgen_object_clone_ref = function(arg0) { 618 | var ret = getObject(arg0); 619 | return addHeapObject(ret); 620 | }; 621 | imports.wbg.__wbg_keyCode_218ac9c01e06b3d5 = function(arg0) { 622 | var ret = getObject(arg0).keyCode; 623 | return ret; 624 | }; 625 | imports.wbg.__wbg_altKey_5136125f8a64c2cf = function(arg0) { 626 | var ret = getObject(arg0).altKey; 627 | return ret; 628 | }; 629 | imports.wbg.__wbg_ctrlKey_8fa508d0b540bc8f = function(arg0) { 630 | var ret = getObject(arg0).ctrlKey; 631 | return ret; 632 | }; 633 | imports.wbg.__wbg_shiftKey_21477313df4f5291 = function(arg0) { 634 | var ret = getObject(arg0).shiftKey; 635 | return ret; 636 | }; 637 | imports.wbg.__wbg_metaKey_d60075e40f8f06d7 = function(arg0) { 638 | var ret = getObject(arg0).metaKey; 639 | return ret; 640 | }; 641 | imports.wbg.__wbg_isComposing_615e6dcf813b18db = function(arg0) { 642 | var ret = getObject(arg0).isComposing; 643 | return ret; 644 | }; 645 | imports.wbg.__wbg_key_6827d862c9cc3928 = function(arg0, arg1) { 646 | var ret = getObject(arg1).key; 647 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 648 | var len0 = WASM_VECTOR_LEN; 649 | getInt32Memory0()[arg0 / 4 + 1] = len0; 650 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 651 | }; 652 | imports.wbg.__wbg_now_44a034aa2e1d73dd = function(arg0) { 653 | var ret = getObject(arg0).now(); 654 | return ret; 655 | }; 656 | imports.wbg.__wbg_identifier_870445e138e72c62 = function(arg0) { 657 | var ret = getObject(arg0).identifier; 658 | return ret; 659 | }; 660 | imports.wbg.__wbg_pageX_902206703620e827 = function(arg0) { 661 | var ret = getObject(arg0).pageX; 662 | return ret; 663 | }; 664 | imports.wbg.__wbg_pageY_e4ea57875008005e = function(arg0) { 665 | var ret = getObject(arg0).pageY; 666 | return ret; 667 | }; 668 | imports.wbg.__wbg_force_f238c10135f8fdbc = function(arg0) { 669 | var ret = getObject(arg0).force; 670 | return ret; 671 | }; 672 | imports.wbg.__wbg_length_7cbe32a18202018e = function(arg0) { 673 | var ret = getObject(arg0).length; 674 | return ret; 675 | }; 676 | imports.wbg.__wbg_item_d23780e616aa6e88 = function(arg0, arg1) { 677 | var ret = getObject(arg0).item(arg1 >>> 0); 678 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 679 | }; 680 | imports.wbg.__wbg_get_73dc28e00ffaad3c = function(arg0, arg1) { 681 | var ret = getObject(arg0)[arg1 >>> 0]; 682 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 683 | }; 684 | imports.wbg.__wbg_body_525168d9e773c3f8 = function(arg0) { 685 | var ret = getObject(arg0).body; 686 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 687 | }; 688 | imports.wbg.__wbg_createElement_ac65a6ce60c4812c = function() { return handleError(function (arg0, arg1, arg2) { 689 | var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2)); 690 | return addHeapObject(ret); 691 | }, arguments) }; 692 | imports.wbg.__wbg_getElementById_b180ea4ada06a837 = function(arg0, arg1, arg2) { 693 | var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2)); 694 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 695 | }; 696 | imports.wbg.__wbg_setid_cea8de140a58c4f1 = function(arg0, arg1, arg2) { 697 | getObject(arg0).id = getStringFromWasm0(arg1, arg2); 698 | }; 699 | imports.wbg.__wbg_scrollLeft_12724e899fab9019 = function(arg0) { 700 | var ret = getObject(arg0).scrollLeft; 701 | return ret; 702 | }; 703 | imports.wbg.__wbg_getBoundingClientRect_dbd899b7c945c55d = function(arg0) { 704 | var ret = getObject(arg0).getBoundingClientRect(); 705 | return addHeapObject(ret); 706 | }; 707 | imports.wbg.__wbg_instanceof_WebGlRenderingContext_c86a7d34366b6a22 = function(arg0) { 708 | var ret = getObject(arg0) instanceof WebGLRenderingContext; 709 | return ret; 710 | }; 711 | imports.wbg.__wbg_drawingBufferWidth_251cf4c11b8fe3b7 = function(arg0) { 712 | var ret = getObject(arg0).drawingBufferWidth; 713 | return ret; 714 | }; 715 | imports.wbg.__wbg_drawingBufferHeight_b65221325b738d84 = function(arg0) { 716 | var ret = getObject(arg0).drawingBufferHeight; 717 | return ret; 718 | }; 719 | imports.wbg.__wbg_bufferData_fc1c7f6f7937aa2f = function(arg0, arg1, arg2, arg3) { 720 | getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); 721 | }; 722 | imports.wbg.__wbg_texImage2D_875a12810798bd91 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { 723 | getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); 724 | }, arguments) }; 725 | imports.wbg.__wbg_activeTexture_e014ee7b74cc1fca = function(arg0, arg1) { 726 | getObject(arg0).activeTexture(arg1 >>> 0); 727 | }; 728 | imports.wbg.__wbg_attachShader_6124f72095cdcf11 = function(arg0, arg1, arg2) { 729 | getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); 730 | }; 731 | imports.wbg.__wbg_bindBuffer_275d909129fba2de = function(arg0, arg1, arg2) { 732 | getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); 733 | }; 734 | imports.wbg.__wbg_bindTexture_f00c4b7db89d6a11 = function(arg0, arg1, arg2) { 735 | getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); 736 | }; 737 | imports.wbg.__wbg_blendFunc_75a5af348aa4b099 = function(arg0, arg1, arg2) { 738 | getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); 739 | }; 740 | imports.wbg.__wbg_clear_65a182ed82b4f282 = function(arg0, arg1) { 741 | getObject(arg0).clear(arg1 >>> 0); 742 | }; 743 | imports.wbg.__wbg_clearColor_e0034d2b65202787 = function(arg0, arg1, arg2, arg3, arg4) { 744 | getObject(arg0).clearColor(arg1, arg2, arg3, arg4); 745 | }; 746 | imports.wbg.__wbg_compileShader_42fdaee532cdb8e4 = function(arg0, arg1) { 747 | getObject(arg0).compileShader(getObject(arg1)); 748 | }; 749 | imports.wbg.__wbg_createBuffer_3691dcedc890b4e8 = function(arg0) { 750 | var ret = getObject(arg0).createBuffer(); 751 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 752 | }; 753 | imports.wbg.__wbg_createProgram_8edfd62e0586640d = function(arg0) { 754 | var ret = getObject(arg0).createProgram(); 755 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 756 | }; 757 | imports.wbg.__wbg_createShader_7033c38612c5688d = function(arg0, arg1) { 758 | var ret = getObject(arg0).createShader(arg1 >>> 0); 759 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 760 | }; 761 | imports.wbg.__wbg_createTexture_65cc306909332417 = function(arg0) { 762 | var ret = getObject(arg0).createTexture(); 763 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 764 | }; 765 | imports.wbg.__wbg_disable_cb4b0073c4406d0d = function(arg0, arg1) { 766 | getObject(arg0).disable(arg1 >>> 0); 767 | }; 768 | imports.wbg.__wbg_drawElements_4ec52596f5751396 = function(arg0, arg1, arg2, arg3, arg4) { 769 | getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); 770 | }; 771 | imports.wbg.__wbg_enable_8f92d01df1a4c77c = function(arg0, arg1) { 772 | getObject(arg0).enable(arg1 >>> 0); 773 | }; 774 | imports.wbg.__wbg_enableVertexAttribArray_4b127e0ecccd536c = function(arg0, arg1) { 775 | getObject(arg0).enableVertexAttribArray(arg1 >>> 0); 776 | }; 777 | imports.wbg.__wbg_getAttribLocation_e3a341ce3579c6e6 = function(arg0, arg1, arg2, arg3) { 778 | var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 779 | return ret; 780 | }; 781 | imports.wbg.__wbg_getProgramInfoLog_0b10742df7a2ebea = function(arg0, arg1, arg2) { 782 | var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); 783 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 784 | var len0 = WASM_VECTOR_LEN; 785 | getInt32Memory0()[arg0 / 4 + 1] = len0; 786 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 787 | }; 788 | imports.wbg.__wbg_getProgramParameter_bb277a1d000dd7a1 = function(arg0, arg1, arg2) { 789 | var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); 790 | return addHeapObject(ret); 791 | }; 792 | imports.wbg.__wbg_getShaderInfoLog_950ab0c3fc7afa37 = function(arg0, arg1, arg2) { 793 | var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); 794 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 795 | var len0 = WASM_VECTOR_LEN; 796 | getInt32Memory0()[arg0 / 4 + 1] = len0; 797 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 798 | }; 799 | imports.wbg.__wbg_getShaderParameter_54891c5545a79869 = function(arg0, arg1, arg2) { 800 | var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); 801 | return addHeapObject(ret); 802 | }; 803 | imports.wbg.__wbg_getUniformLocation_8b0d07c81923dc0a = function(arg0, arg1, arg2, arg3) { 804 | var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 805 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 806 | }; 807 | imports.wbg.__wbg_linkProgram_0be4bd888f743eb0 = function(arg0, arg1) { 808 | getObject(arg0).linkProgram(getObject(arg1)); 809 | }; 810 | imports.wbg.__wbg_scissor_0a69745d4b30dc5a = function(arg0, arg1, arg2, arg3, arg4) { 811 | getObject(arg0).scissor(arg1, arg2, arg3, arg4); 812 | }; 813 | imports.wbg.__wbg_shaderSource_c666880b620c8f34 = function(arg0, arg1, arg2, arg3) { 814 | getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); 815 | }; 816 | imports.wbg.__wbg_texParameteri_dd58ff2ef56511b2 = function(arg0, arg1, arg2, arg3) { 817 | getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); 818 | }; 819 | imports.wbg.__wbg_uniform1i_e39f64f3710aa2dc = function(arg0, arg1, arg2) { 820 | getObject(arg0).uniform1i(getObject(arg1), arg2); 821 | }; 822 | imports.wbg.__wbg_uniform2f_82d8cb2acf928fdc = function(arg0, arg1, arg2, arg3) { 823 | getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); 824 | }; 825 | imports.wbg.__wbg_useProgram_fb4984fb080bcd61 = function(arg0, arg1) { 826 | getObject(arg0).useProgram(getObject(arg1)); 827 | }; 828 | imports.wbg.__wbg_vertexAttribPointer_d00262e9bf7a3742 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { 829 | getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); 830 | }; 831 | imports.wbg.__wbg_viewport_39356c8cdec98b8b = function(arg0, arg1, arg2, arg3, arg4) { 832 | getObject(arg0).viewport(arg1, arg2, arg3, arg4); 833 | }; 834 | imports.wbg.__wbg_error_d95afd6217cfd219 = function(arg0) { 835 | console.error(getObject(arg0)); 836 | }; 837 | imports.wbg.__wbg_log_9a99fb1af846153b = function(arg0) { 838 | console.log(getObject(arg0)); 839 | }; 840 | imports.wbg.__wbg_warn_b39e749f1dc02058 = function(arg0) { 841 | console.warn(getObject(arg0)); 842 | }; 843 | imports.wbg.__wbg_scrollTop_48a9fc126383767d = function(arg0) { 844 | var ret = getObject(arg0).scrollTop; 845 | return ret; 846 | }; 847 | imports.wbg.__wbg_hidden_4ee4c56ccb618f43 = function(arg0) { 848 | var ret = getObject(arg0).hidden; 849 | return ret; 850 | }; 851 | imports.wbg.__wbg_sethidden_4e6127e185ecf2df = function(arg0, arg1) { 852 | getObject(arg0).hidden = arg1 !== 0; 853 | }; 854 | imports.wbg.__wbg_style_25309daade79abb3 = function(arg0) { 855 | var ret = getObject(arg0).style; 856 | return addHeapObject(ret); 857 | }; 858 | imports.wbg.__wbg_offsetTop_c8896829575199ae = function(arg0) { 859 | var ret = getObject(arg0).offsetTop; 860 | return ret; 861 | }; 862 | imports.wbg.__wbg_offsetLeft_d2ef32e9fc657e70 = function(arg0) { 863 | var ret = getObject(arg0).offsetLeft; 864 | return ret; 865 | }; 866 | imports.wbg.__wbg_offsetWidth_7dd96a3df070d552 = function(arg0) { 867 | var ret = getObject(arg0).offsetWidth; 868 | return ret; 869 | }; 870 | imports.wbg.__wbg_blur_b336d41728268f5a = function() { return handleError(function (arg0) { 871 | getObject(arg0).blur(); 872 | }, arguments) }; 873 | imports.wbg.__wbg_focus_2fac919cca20d33b = function() { return handleError(function (arg0) { 874 | getObject(arg0).focus(); 875 | }, arguments) }; 876 | imports.wbg.__wbg_instanceof_HtmlInputElement_df6fbc606ba24e20 = function(arg0) { 877 | var ret = getObject(arg0) instanceof HTMLInputElement; 878 | return ret; 879 | }; 880 | imports.wbg.__wbg_setautofocus_700ebffe64c7c2a3 = function(arg0, arg1) { 881 | getObject(arg0).autofocus = arg1 !== 0; 882 | }; 883 | imports.wbg.__wbg_setsize_b6692780c79d2467 = function(arg0, arg1) { 884 | getObject(arg0).size = arg1 >>> 0; 885 | }; 886 | imports.wbg.__wbg_value_f4c762446c572119 = function(arg0, arg1) { 887 | var ret = getObject(arg1).value; 888 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 889 | var len0 = WASM_VECTOR_LEN; 890 | getInt32Memory0()[arg0 / 4 + 1] = len0; 891 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 892 | }; 893 | imports.wbg.__wbg_setvalue_65a652cfd99c8a4a = function(arg0, arg1, arg2) { 894 | getObject(arg0).value = getStringFromWasm0(arg1, arg2); 895 | }; 896 | imports.wbg.__wbg_type_55a19f61b3198ce6 = function(arg0, arg1) { 897 | var ret = getObject(arg1).type; 898 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 899 | var len0 = WASM_VECTOR_LEN; 900 | getInt32Memory0()[arg0 / 4 + 1] = len0; 901 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 902 | }; 903 | imports.wbg.__wbg_preventDefault_7c4d18eb2bb1a26a = function(arg0) { 904 | getObject(arg0).preventDefault(); 905 | }; 906 | imports.wbg.__wbg_stopPropagation_11ccdc30c46ad19a = function(arg0) { 907 | getObject(arg0).stopPropagation(); 908 | }; 909 | imports.wbg.__wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792 = function(arg0) { 910 | var ret = getObject(arg0) instanceof HTMLCanvasElement; 911 | return ret; 912 | }; 913 | imports.wbg.__wbg_width_9eb2c66ac9dde633 = function(arg0) { 914 | var ret = getObject(arg0).width; 915 | return ret; 916 | }; 917 | imports.wbg.__wbg_setwidth_f3c88eb520ba8d47 = function(arg0, arg1) { 918 | getObject(arg0).width = arg1 >>> 0; 919 | }; 920 | imports.wbg.__wbg_height_64e5d4222af3fb90 = function(arg0) { 921 | var ret = getObject(arg0).height; 922 | return ret; 923 | }; 924 | imports.wbg.__wbg_setheight_5a1abba41e35c42a = function(arg0, arg1) { 925 | getObject(arg0).height = arg1 >>> 0; 926 | }; 927 | imports.wbg.__wbg_getContext_813df131fcbd6e91 = function() { return handleError(function (arg0, arg1, arg2) { 928 | var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2)); 929 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 930 | }, arguments) }; 931 | imports.wbg.__wbg_top_22e7024d271b5677 = function(arg0) { 932 | var ret = getObject(arg0).top; 933 | return ret; 934 | }; 935 | imports.wbg.__wbg_left_f2f24ba3851b8295 = function(arg0) { 936 | var ret = getObject(arg0).left; 937 | return ret; 938 | }; 939 | imports.wbg.__wbg_touches_976280ecfdead054 = function(arg0) { 940 | var ret = getObject(arg0).touches; 941 | return addHeapObject(ret); 942 | }; 943 | imports.wbg.__wbg_changedTouches_a281259c12af3e85 = function(arg0) { 944 | var ret = getObject(arg0).changedTouches; 945 | return addHeapObject(ret); 946 | }; 947 | imports.wbg.__wbg_call_ba36642bd901572b = function() { return handleError(function (arg0, arg1) { 948 | var ret = getObject(arg0).call(getObject(arg1)); 949 | return addHeapObject(ret); 950 | }, arguments) }; 951 | imports.wbg.__wbg_newnoargs_9fdd8f3961dd1bee = function(arg0, arg1) { 952 | var ret = new Function(getStringFromWasm0(arg0, arg1)); 953 | return addHeapObject(ret); 954 | }; 955 | imports.wbg.__wbg_getHours_97dfe84bae4276f1 = function(arg0) { 956 | var ret = getObject(arg0).getHours(); 957 | return ret; 958 | }; 959 | imports.wbg.__wbg_getMilliseconds_eab6600bacdff779 = function(arg0) { 960 | var ret = getObject(arg0).getMilliseconds(); 961 | return ret; 962 | }; 963 | imports.wbg.__wbg_getMinutes_f3d9099bcf4e42ab = function(arg0) { 964 | var ret = getObject(arg0).getMinutes(); 965 | return ret; 966 | }; 967 | imports.wbg.__wbg_getSeconds_dd69f2cd151dbe65 = function(arg0) { 968 | var ret = getObject(arg0).getSeconds(); 969 | return ret; 970 | }; 971 | imports.wbg.__wbg_new0_85024d5e91a046e9 = function() { 972 | var ret = new Date(); 973 | return addHeapObject(ret); 974 | }; 975 | imports.wbg.__wbg_resolve_cae3d8f752f5db88 = function(arg0) { 976 | var ret = Promise.resolve(getObject(arg0)); 977 | return addHeapObject(ret); 978 | }; 979 | imports.wbg.__wbg_then_c2361a9d5c9a4fcb = function(arg0, arg1) { 980 | var ret = getObject(arg0).then(getObject(arg1)); 981 | return addHeapObject(ret); 982 | }; 983 | imports.wbg.__wbg_then_6c9a4bf55755f9b8 = function(arg0, arg1, arg2) { 984 | var ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); 985 | return addHeapObject(ret); 986 | }; 987 | imports.wbg.__wbg_self_bb69a836a72ec6e9 = function() { return handleError(function () { 988 | var ret = self.self; 989 | return addHeapObject(ret); 990 | }, arguments) }; 991 | imports.wbg.__wbg_window_3304fc4b414c9693 = function() { return handleError(function () { 992 | var ret = window.window; 993 | return addHeapObject(ret); 994 | }, arguments) }; 995 | imports.wbg.__wbg_globalThis_e0d21cabc6630763 = function() { return handleError(function () { 996 | var ret = globalThis.globalThis; 997 | return addHeapObject(ret); 998 | }, arguments) }; 999 | imports.wbg.__wbg_global_8463719227271676 = function() { return handleError(function () { 1000 | var ret = global.global; 1001 | return addHeapObject(ret); 1002 | }, arguments) }; 1003 | imports.wbg.__wbindgen_is_undefined = function(arg0) { 1004 | var ret = getObject(arg0) === undefined; 1005 | return ret; 1006 | }; 1007 | imports.wbg.__wbg_buffer_9e184d6f785de5ed = function(arg0) { 1008 | var ret = getObject(arg0).buffer; 1009 | return addHeapObject(ret); 1010 | }; 1011 | imports.wbg.__wbg_new_aca5aec908023ece = function(arg0) { 1012 | var ret = new Int16Array(getObject(arg0)); 1013 | return addHeapObject(ret); 1014 | }; 1015 | imports.wbg.__wbg_new_e8101319e4cf95fc = function(arg0) { 1016 | var ret = new Uint8Array(getObject(arg0)); 1017 | return addHeapObject(ret); 1018 | }; 1019 | imports.wbg.__wbg_new_d69bbe3db485d457 = function(arg0) { 1020 | var ret = new Float32Array(getObject(arg0)); 1021 | return addHeapObject(ret); 1022 | }; 1023 | imports.wbg.__wbg_subarray_67cca750e048c2bf = function(arg0, arg1, arg2) { 1024 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1025 | return addHeapObject(ret); 1026 | }; 1027 | imports.wbg.__wbg_subarray_901ede8318da52a6 = function(arg0, arg1, arg2) { 1028 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1029 | return addHeapObject(ret); 1030 | }; 1031 | imports.wbg.__wbg_subarray_8a2a686b9381b60f = function(arg0, arg1, arg2) { 1032 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1033 | return addHeapObject(ret); 1034 | }; 1035 | imports.wbg.__wbg_instanceof_Memory_04d3f55ecfcadb62 = function(arg0) { 1036 | var ret = getObject(arg0) instanceof WebAssembly.Memory; 1037 | return ret; 1038 | }; 1039 | imports.wbg.__wbindgen_number_get = function(arg0, arg1) { 1040 | const obj = getObject(arg1); 1041 | var ret = typeof(obj) === 'number' ? obj : undefined; 1042 | getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; 1043 | getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); 1044 | }; 1045 | imports.wbg.__wbindgen_boolean_get = function(arg0) { 1046 | const v = getObject(arg0); 1047 | var ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; 1048 | return ret; 1049 | }; 1050 | imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { 1051 | var ret = debugString(getObject(arg1)); 1052 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 1053 | var len0 = WASM_VECTOR_LEN; 1054 | getInt32Memory0()[arg0 / 4 + 1] = len0; 1055 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 1056 | }; 1057 | imports.wbg.__wbindgen_throw = function(arg0, arg1) { 1058 | throw new Error(getStringFromWasm0(arg0, arg1)); 1059 | }; 1060 | imports.wbg.__wbindgen_rethrow = function(arg0) { 1061 | throw takeObject(arg0); 1062 | }; 1063 | imports.wbg.__wbindgen_memory = function() { 1064 | var ret = wasm.memory; 1065 | return addHeapObject(ret); 1066 | }; 1067 | imports.wbg.__wbindgen_closure_wrapper672 = function(arg0, arg1, arg2) { 1068 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_24); 1069 | return addHeapObject(ret); 1070 | }; 1071 | imports.wbg.__wbindgen_closure_wrapper673 = function(arg0, arg1, arg2) { 1072 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_27); 1073 | return addHeapObject(ret); 1074 | }; 1075 | imports.wbg.__wbindgen_closure_wrapper675 = function(arg0, arg1, arg2) { 1076 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_30); 1077 | return addHeapObject(ret); 1078 | }; 1079 | imports.wbg.__wbindgen_closure_wrapper677 = function(arg0, arg1, arg2) { 1080 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_33); 1081 | return addHeapObject(ret); 1082 | }; 1083 | imports.wbg.__wbindgen_closure_wrapper679 = function(arg0, arg1, arg2) { 1084 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_36); 1085 | return addHeapObject(ret); 1086 | }; 1087 | imports.wbg.__wbindgen_closure_wrapper682 = function(arg0, arg1, arg2) { 1088 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_39); 1089 | return addHeapObject(ret); 1090 | }; 1091 | imports.wbg.__wbindgen_closure_wrapper684 = function(arg0, arg1, arg2) { 1092 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_42); 1093 | return addHeapObject(ret); 1094 | }; 1095 | imports.wbg.__wbindgen_closure_wrapper686 = function(arg0, arg1, arg2) { 1096 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_45); 1097 | return addHeapObject(ret); 1098 | }; 1099 | imports.wbg.__wbindgen_closure_wrapper688 = function(arg0, arg1, arg2) { 1100 | var ret = makeMutClosure(arg0, arg1, 113, __wbg_adapter_48); 1101 | return addHeapObject(ret); 1102 | }; 1103 | imports.wbg.__wbindgen_closure_wrapper878 = function(arg0, arg1, arg2) { 1104 | var ret = makeMutClosure(arg0, arg1, 211, __wbg_adapter_51); 1105 | return addHeapObject(ret); 1106 | }; 1107 | 1108 | if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { 1109 | input = fetch(input); 1110 | } 1111 | 1112 | 1113 | 1114 | const { instance, module } = await load(await input, imports); 1115 | 1116 | wasm = instance.exports; 1117 | init.__wbindgen_wasm_module = module; 1118 | 1119 | return wasm; 1120 | } 1121 | 1122 | wasm_bindgen = Object.assign(init, __exports); 1123 | 1124 | })(); 1125 | -------------------------------------------------------------------------------- /docs/egui_template_bg.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet/Zac/1515668b08046e5e2c8d22e45aa8a3af3d24fb2e/docs/egui_template_bg.wasm -------------------------------------------------------------------------------- /docs/hompy.js: -------------------------------------------------------------------------------- 1 | let wasm_bindgen; 2 | (function() { 3 | const __exports = {}; 4 | let wasm; 5 | 6 | const heap = new Array(32).fill(undefined); 7 | 8 | heap.push(undefined, null, true, false); 9 | 10 | function getObject(idx) { return heap[idx]; } 11 | 12 | let heap_next = heap.length; 13 | 14 | function dropObject(idx) { 15 | if (idx < 36) return; 16 | heap[idx] = heap_next; 17 | heap_next = idx; 18 | } 19 | 20 | function takeObject(idx) { 21 | const ret = getObject(idx); 22 | dropObject(idx); 23 | return ret; 24 | } 25 | 26 | let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); 27 | 28 | cachedTextDecoder.decode(); 29 | 30 | let cachegetUint8Memory0 = null; 31 | function getUint8Memory0() { 32 | if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { 33 | cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); 34 | } 35 | return cachegetUint8Memory0; 36 | } 37 | 38 | function getStringFromWasm0(ptr, len) { 39 | return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); 40 | } 41 | 42 | function addHeapObject(obj) { 43 | if (heap_next === heap.length) heap.push(heap.length + 1); 44 | const idx = heap_next; 45 | heap_next = heap[idx]; 46 | 47 | heap[idx] = obj; 48 | return idx; 49 | } 50 | 51 | function isLikeNone(x) { 52 | return x === undefined || x === null; 53 | } 54 | 55 | let cachegetFloat64Memory0 = null; 56 | function getFloat64Memory0() { 57 | if (cachegetFloat64Memory0 === null || cachegetFloat64Memory0.buffer !== wasm.memory.buffer) { 58 | cachegetFloat64Memory0 = new Float64Array(wasm.memory.buffer); 59 | } 60 | return cachegetFloat64Memory0; 61 | } 62 | 63 | let cachegetInt32Memory0 = null; 64 | function getInt32Memory0() { 65 | if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) { 66 | cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer); 67 | } 68 | return cachegetInt32Memory0; 69 | } 70 | 71 | function debugString(val) { 72 | // primitive types 73 | const type = typeof val; 74 | if (type == 'number' || type == 'boolean' || val == null) { 75 | return `${val}`; 76 | } 77 | if (type == 'string') { 78 | return `"${val}"`; 79 | } 80 | if (type == 'symbol') { 81 | const description = val.description; 82 | if (description == null) { 83 | return 'Symbol'; 84 | } else { 85 | return `Symbol(${description})`; 86 | } 87 | } 88 | if (type == 'function') { 89 | const name = val.name; 90 | if (typeof name == 'string' && name.length > 0) { 91 | return `Function(${name})`; 92 | } else { 93 | return 'Function'; 94 | } 95 | } 96 | // objects 97 | if (Array.isArray(val)) { 98 | const length = val.length; 99 | let debug = '['; 100 | if (length > 0) { 101 | debug += debugString(val[0]); 102 | } 103 | for(let i = 1; i < length; i++) { 104 | debug += ', ' + debugString(val[i]); 105 | } 106 | debug += ']'; 107 | return debug; 108 | } 109 | // Test for built-in 110 | const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); 111 | let className; 112 | if (builtInMatches.length > 1) { 113 | className = builtInMatches[1]; 114 | } else { 115 | // Failed to match the standard '[object ClassName]' 116 | return toString.call(val); 117 | } 118 | if (className == 'Object') { 119 | // we're a user defined class or Object 120 | // JSON.stringify avoids problems with cycles, and is generally much 121 | // easier than looping through ownProperties of `val`. 122 | try { 123 | return 'Object(' + JSON.stringify(val) + ')'; 124 | } catch (_) { 125 | return 'Object'; 126 | } 127 | } 128 | // errors 129 | if (val instanceof Error) { 130 | return `${val.name}: ${val.message}\n${val.stack}`; 131 | } 132 | // TODO we could test for more things here, like `Set`s and `Map`s. 133 | return className; 134 | } 135 | 136 | let WASM_VECTOR_LEN = 0; 137 | 138 | let cachedTextEncoder = new TextEncoder('utf-8'); 139 | 140 | const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' 141 | ? function (arg, view) { 142 | return cachedTextEncoder.encodeInto(arg, view); 143 | } 144 | : function (arg, view) { 145 | const buf = cachedTextEncoder.encode(arg); 146 | view.set(buf); 147 | return { 148 | read: arg.length, 149 | written: buf.length 150 | }; 151 | }); 152 | 153 | function passStringToWasm0(arg, malloc, realloc) { 154 | 155 | if (realloc === undefined) { 156 | const buf = cachedTextEncoder.encode(arg); 157 | const ptr = malloc(buf.length); 158 | getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); 159 | WASM_VECTOR_LEN = buf.length; 160 | return ptr; 161 | } 162 | 163 | let len = arg.length; 164 | let ptr = malloc(len); 165 | 166 | const mem = getUint8Memory0(); 167 | 168 | let offset = 0; 169 | 170 | for (; offset < len; offset++) { 171 | const code = arg.charCodeAt(offset); 172 | if (code > 0x7F) break; 173 | mem[ptr + offset] = code; 174 | } 175 | 176 | if (offset !== len) { 177 | if (offset !== 0) { 178 | arg = arg.slice(offset); 179 | } 180 | ptr = realloc(ptr, len, len = offset + arg.length * 3); 181 | const view = getUint8Memory0().subarray(ptr + offset, ptr + len); 182 | const ret = encodeString(arg, view); 183 | 184 | offset += ret.written; 185 | } 186 | 187 | WASM_VECTOR_LEN = offset; 188 | return ptr; 189 | } 190 | 191 | function makeMutClosure(arg0, arg1, dtor, f) { 192 | const state = { a: arg0, b: arg1, cnt: 1, dtor }; 193 | const real = (...args) => { 194 | // First up with a closure we increment the internal reference 195 | // count. This ensures that the Rust closure environment won't 196 | // be deallocated while we're invoking it. 197 | state.cnt++; 198 | const a = state.a; 199 | state.a = 0; 200 | try { 201 | return f(a, state.b, ...args); 202 | } finally { 203 | if (--state.cnt === 0) { 204 | wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); 205 | 206 | } else { 207 | state.a = a; 208 | } 209 | } 210 | }; 211 | real.original = state; 212 | 213 | return real; 214 | } 215 | function __wbg_adapter_24(arg0, arg1) { 216 | wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h3a7ce83077f97acf(arg0, arg1); 217 | } 218 | 219 | function __wbg_adapter_27(arg0, arg1) { 220 | wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__haff0924f2a4db8be(arg0, arg1); 221 | } 222 | 223 | function __wbg_adapter_30(arg0, arg1, arg2) { 224 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0a63432c28a1666b(arg0, arg1, addHeapObject(arg2)); 225 | } 226 | 227 | function __wbg_adapter_33(arg0, arg1, arg2) { 228 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0a63432c28a1666b(arg0, arg1, addHeapObject(arg2)); 229 | } 230 | 231 | function __wbg_adapter_36(arg0, arg1, arg2) { 232 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0a63432c28a1666b(arg0, arg1, addHeapObject(arg2)); 233 | } 234 | 235 | function __wbg_adapter_39(arg0, arg1, arg2) { 236 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0a63432c28a1666b(arg0, arg1, addHeapObject(arg2)); 237 | } 238 | 239 | function __wbg_adapter_42(arg0, arg1, arg2) { 240 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0a63432c28a1666b(arg0, arg1, addHeapObject(arg2)); 241 | } 242 | 243 | function __wbg_adapter_45(arg0, arg1, arg2) { 244 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0a63432c28a1666b(arg0, arg1, addHeapObject(arg2)); 245 | } 246 | 247 | function __wbg_adapter_48(arg0, arg1, arg2) { 248 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0a63432c28a1666b(arg0, arg1, addHeapObject(arg2)); 249 | } 250 | 251 | function __wbg_adapter_51(arg0, arg1, arg2) { 252 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h27e3f3519b0b4d2c(arg0, arg1, addHeapObject(arg2)); 253 | } 254 | 255 | /** 256 | * This is the entry-point for all the web-assembly. 257 | * This is called once from the HTML. 258 | * It loads the app, installs some callbacks, then returns. 259 | * You can add more callbacks like this if you want to call in to your code. 260 | * @param {string} canvas_id 261 | */ 262 | __exports.start = function(canvas_id) { 263 | var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 264 | var len0 = WASM_VECTOR_LEN; 265 | wasm.start(ptr0, len0); 266 | }; 267 | 268 | function getArrayU8FromWasm0(ptr, len) { 269 | return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); 270 | } 271 | 272 | function handleError(f, args) { 273 | try { 274 | return f.apply(this, args); 275 | } catch (e) { 276 | wasm.__wbindgen_exn_store(addHeapObject(e)); 277 | } 278 | } 279 | 280 | async function load(module, imports) { 281 | if (typeof Response === 'function' && module instanceof Response) { 282 | if (typeof WebAssembly.instantiateStreaming === 'function') { 283 | try { 284 | return await WebAssembly.instantiateStreaming(module, imports); 285 | 286 | } catch (e) { 287 | if (module.headers.get('Content-Type') != 'application/wasm') { 288 | console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); 289 | 290 | } else { 291 | throw e; 292 | } 293 | } 294 | } 295 | 296 | const bytes = await module.arrayBuffer(); 297 | return await WebAssembly.instantiate(bytes, imports); 298 | 299 | } else { 300 | const instance = await WebAssembly.instantiate(module, imports); 301 | 302 | if (instance instanceof WebAssembly.Instance) { 303 | return { instance, module }; 304 | 305 | } else { 306 | return instance; 307 | } 308 | } 309 | } 310 | 311 | async function init(input) { 312 | if (typeof input === 'undefined') { 313 | let src; 314 | if (typeof document === 'undefined') { 315 | src = location.href; 316 | } else { 317 | src = document.currentScript.src; 318 | } 319 | input = src.replace(/\.js$/, '_bg.wasm'); 320 | } 321 | const imports = {}; 322 | imports.wbg = {}; 323 | imports.wbg.__wbindgen_object_drop_ref = function(arg0) { 324 | takeObject(arg0); 325 | }; 326 | imports.wbg.__wbindgen_string_new = function(arg0, arg1) { 327 | var ret = getStringFromWasm0(arg0, arg1); 328 | return addHeapObject(ret); 329 | }; 330 | imports.wbg.__wbindgen_cb_drop = function(arg0) { 331 | const obj = takeObject(arg0).original; 332 | if (obj.cnt-- == 1) { 333 | obj.a = 0; 334 | return true; 335 | } 336 | var ret = false; 337 | return ret; 338 | }; 339 | imports.wbg.__wbg_instanceof_WebGl2RenderingContext_13e6354db7f49c18 = function(arg0) { 340 | var ret = getObject(arg0) instanceof WebGL2RenderingContext; 341 | return ret; 342 | }; 343 | imports.wbg.__wbg_drawingBufferWidth_ef285db57df0f893 = function(arg0) { 344 | var ret = getObject(arg0).drawingBufferWidth; 345 | return ret; 346 | }; 347 | imports.wbg.__wbg_drawingBufferHeight_a44c735d2f8ebc62 = function(arg0) { 348 | var ret = getObject(arg0).drawingBufferHeight; 349 | return ret; 350 | }; 351 | imports.wbg.__wbg_bufferData_9129d14b1f0de925 = function(arg0, arg1, arg2, arg3) { 352 | getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); 353 | }; 354 | imports.wbg.__wbg_texImage2D_c3b86a5e56a49764 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { 355 | getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); 356 | }, arguments) }; 357 | imports.wbg.__wbg_activeTexture_62fb1a120971f7d8 = function(arg0, arg1) { 358 | getObject(arg0).activeTexture(arg1 >>> 0); 359 | }; 360 | imports.wbg.__wbg_attachShader_8a9eaf84fe954e03 = function(arg0, arg1, arg2) { 361 | getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); 362 | }; 363 | imports.wbg.__wbg_bindBuffer_a1ad7b194007470b = function(arg0, arg1, arg2) { 364 | getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); 365 | }; 366 | imports.wbg.__wbg_bindTexture_a25575c0badfe44b = function(arg0, arg1, arg2) { 367 | getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); 368 | }; 369 | imports.wbg.__wbg_blendFunc_e1d63775ac2fdb5b = function(arg0, arg1, arg2) { 370 | getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); 371 | }; 372 | imports.wbg.__wbg_clear_7a7de3b0e9ae30c3 = function(arg0, arg1) { 373 | getObject(arg0).clear(arg1 >>> 0); 374 | }; 375 | imports.wbg.__wbg_clearColor_9b9649257ee72f16 = function(arg0, arg1, arg2, arg3, arg4) { 376 | getObject(arg0).clearColor(arg1, arg2, arg3, arg4); 377 | }; 378 | imports.wbg.__wbg_compileShader_69fd6c32a532c35a = function(arg0, arg1) { 379 | getObject(arg0).compileShader(getObject(arg1)); 380 | }; 381 | imports.wbg.__wbg_createBuffer_f277512b66ff156c = function(arg0) { 382 | var ret = getObject(arg0).createBuffer(); 383 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 384 | }; 385 | imports.wbg.__wbg_createProgram_6b17e2185bcf1673 = function(arg0) { 386 | var ret = getObject(arg0).createProgram(); 387 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 388 | }; 389 | imports.wbg.__wbg_createShader_5d6f7b01da5682e3 = function(arg0, arg1) { 390 | var ret = getObject(arg0).createShader(arg1 >>> 0); 391 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 392 | }; 393 | imports.wbg.__wbg_createTexture_42e03addb914d25f = function(arg0) { 394 | var ret = getObject(arg0).createTexture(); 395 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 396 | }; 397 | imports.wbg.__wbg_disable_ea9b2fd524e20bea = function(arg0, arg1) { 398 | getObject(arg0).disable(arg1 >>> 0); 399 | }; 400 | imports.wbg.__wbg_drawElements_fdc70c7e5299d334 = function(arg0, arg1, arg2, arg3, arg4) { 401 | getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); 402 | }; 403 | imports.wbg.__wbg_enable_f39af773aafb63f0 = function(arg0, arg1) { 404 | getObject(arg0).enable(arg1 >>> 0); 405 | }; 406 | imports.wbg.__wbg_enableVertexAttribArray_498ab84c1826a745 = function(arg0, arg1) { 407 | getObject(arg0).enableVertexAttribArray(arg1 >>> 0); 408 | }; 409 | imports.wbg.__wbg_getAttribLocation_241dd0e4c29138d2 = function(arg0, arg1, arg2, arg3) { 410 | var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 411 | return ret; 412 | }; 413 | imports.wbg.__wbg_getProgramInfoLog_8d7bd18699310151 = function(arg0, arg1, arg2) { 414 | var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); 415 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 416 | var len0 = WASM_VECTOR_LEN; 417 | getInt32Memory0()[arg0 / 4 + 1] = len0; 418 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 419 | }; 420 | imports.wbg.__wbg_getProgramParameter_3315a81c35911e56 = function(arg0, arg1, arg2) { 421 | var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); 422 | return addHeapObject(ret); 423 | }; 424 | imports.wbg.__wbg_getShaderInfoLog_c5dbc0816b0110fe = function(arg0, arg1, arg2) { 425 | var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); 426 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 427 | var len0 = WASM_VECTOR_LEN; 428 | getInt32Memory0()[arg0 / 4 + 1] = len0; 429 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 430 | }; 431 | imports.wbg.__wbg_getShaderParameter_7d75b4fa2fdd22b7 = function(arg0, arg1, arg2) { 432 | var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); 433 | return addHeapObject(ret); 434 | }; 435 | imports.wbg.__wbg_getUniformLocation_736e12e23e8350b7 = function(arg0, arg1, arg2, arg3) { 436 | var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 437 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 438 | }; 439 | imports.wbg.__wbg_linkProgram_b43539ddb67e7253 = function(arg0, arg1) { 440 | getObject(arg0).linkProgram(getObject(arg1)); 441 | }; 442 | imports.wbg.__wbg_pixelStorei_707a2760a4bb063f = function(arg0, arg1, arg2) { 443 | getObject(arg0).pixelStorei(arg1 >>> 0, arg2); 444 | }; 445 | imports.wbg.__wbg_scissor_ab029c7a9354d83d = function(arg0, arg1, arg2, arg3, arg4) { 446 | getObject(arg0).scissor(arg1, arg2, arg3, arg4); 447 | }; 448 | imports.wbg.__wbg_shaderSource_bd5f73d004d97e08 = function(arg0, arg1, arg2, arg3) { 449 | getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); 450 | }; 451 | imports.wbg.__wbg_texParameteri_e5284ef0c47b2a2e = function(arg0, arg1, arg2, arg3) { 452 | getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); 453 | }; 454 | imports.wbg.__wbg_uniform1i_0740fc72ca42db54 = function(arg0, arg1, arg2) { 455 | getObject(arg0).uniform1i(getObject(arg1), arg2); 456 | }; 457 | imports.wbg.__wbg_uniform2f_95c32de4f3ada8ef = function(arg0, arg1, arg2, arg3) { 458 | getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); 459 | }; 460 | imports.wbg.__wbg_useProgram_84fff09700844d7b = function(arg0, arg1) { 461 | getObject(arg0).useProgram(getObject(arg1)); 462 | }; 463 | imports.wbg.__wbg_vertexAttribPointer_a4ee272ddd79df3b = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { 464 | getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); 465 | }; 466 | imports.wbg.__wbg_viewport_3418ae7378baf8c5 = function(arg0, arg1, arg2, arg3, arg4) { 467 | getObject(arg0).viewport(arg1, arg2, arg3, arg4); 468 | }; 469 | imports.wbg.__wbg_instanceof_Window_11e25482011fc506 = function(arg0) { 470 | var ret = getObject(arg0) instanceof Window; 471 | return ret; 472 | }; 473 | imports.wbg.__wbg_document_5aff8cd83ef968f5 = function(arg0) { 474 | var ret = getObject(arg0).document; 475 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 476 | }; 477 | imports.wbg.__wbg_location_05eee59b82ccc208 = function(arg0) { 478 | var ret = getObject(arg0).location; 479 | return addHeapObject(ret); 480 | }; 481 | imports.wbg.__wbg_navigator_5c90643c2a2b6cda = function(arg0) { 482 | var ret = getObject(arg0).navigator; 483 | return addHeapObject(ret); 484 | }; 485 | imports.wbg.__wbg_innerWidth_8c5001da2fdd6a9e = function() { return handleError(function (arg0) { 486 | var ret = getObject(arg0).innerWidth; 487 | return addHeapObject(ret); 488 | }, arguments) }; 489 | imports.wbg.__wbg_innerHeight_03d3f1d9eb5f7034 = function() { return handleError(function (arg0) { 490 | var ret = getObject(arg0).innerHeight; 491 | return addHeapObject(ret); 492 | }, arguments) }; 493 | imports.wbg.__wbg_devicePixelRatio_d92cc4c40f432496 = function(arg0) { 494 | var ret = getObject(arg0).devicePixelRatio; 495 | return ret; 496 | }; 497 | imports.wbg.__wbg_performance_9d1ecf711183e1d5 = function(arg0) { 498 | var ret = getObject(arg0).performance; 499 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 500 | }; 501 | imports.wbg.__wbg_localStorage_b787eb9a4418c2b1 = function() { return handleError(function (arg0) { 502 | var ret = getObject(arg0).localStorage; 503 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 504 | }, arguments) }; 505 | imports.wbg.__wbg_matchMedia_dc4441d20b28fe10 = function() { return handleError(function (arg0, arg1, arg2) { 506 | var ret = getObject(arg0).matchMedia(getStringFromWasm0(arg1, arg2)); 507 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 508 | }, arguments) }; 509 | imports.wbg.__wbg_open_29812718979722ad = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 510 | var ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 511 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 512 | }, arguments) }; 513 | imports.wbg.__wbg_requestAnimationFrame_1fb079d39e1b8a26 = function() { return handleError(function (arg0, arg1) { 514 | var ret = getObject(arg0).requestAnimationFrame(getObject(arg1)); 515 | return ret; 516 | }, arguments) }; 517 | imports.wbg.__wbg_setInterval_d1fefc3dab46c6b6 = function() { return handleError(function (arg0, arg1, arg2) { 518 | var ret = getObject(arg0).setInterval(getObject(arg1), arg2); 519 | return ret; 520 | }, arguments) }; 521 | imports.wbg.__wbg_setTimeout_ce28a603906ebcbb = function() { return handleError(function (arg0, arg1, arg2) { 522 | var ret = getObject(arg0).setTimeout(getObject(arg1), arg2); 523 | return ret; 524 | }, arguments) }; 525 | imports.wbg.__wbg_clipboard_a304e2b83d0400c6 = function(arg0) { 526 | var ret = getObject(arg0).clipboard; 527 | return addHeapObject(ret); 528 | }; 529 | imports.wbg.__wbg_userAgent_9c09d784d0828a93 = function() { return handleError(function (arg0, arg1) { 530 | var ret = getObject(arg1).userAgent; 531 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 532 | var len0 = WASM_VECTOR_LEN; 533 | getInt32Memory0()[arg0 / 4 + 1] = len0; 534 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 535 | }, arguments) }; 536 | imports.wbg.__wbg_appendChild_6ed236bb79c198df = function() { return handleError(function (arg0, arg1) { 537 | var ret = getObject(arg0).appendChild(getObject(arg1)); 538 | return addHeapObject(ret); 539 | }, arguments) }; 540 | imports.wbg.__wbg_hash_1496bf468ca4142a = function() { return handleError(function (arg0, arg1) { 541 | var ret = getObject(arg1).hash; 542 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 543 | var len0 = WASM_VECTOR_LEN; 544 | getInt32Memory0()[arg0 / 4 + 1] = len0; 545 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 546 | }, arguments) }; 547 | imports.wbg.__wbg_getItem_1c87352132d0b415 = function() { return handleError(function (arg0, arg1, arg2, arg3) { 548 | var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3)); 549 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 550 | var len0 = WASM_VECTOR_LEN; 551 | getInt32Memory0()[arg0 / 4 + 1] = len0; 552 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 553 | }, arguments) }; 554 | imports.wbg.__wbg_setItem_103b1e46491c9b0e = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 555 | getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 556 | }, arguments) }; 557 | imports.wbg.__wbg_clientX_5bbce6c078e1510e = function(arg0) { 558 | var ret = getObject(arg0).clientX; 559 | return ret; 560 | }; 561 | imports.wbg.__wbg_clientY_af6c4369507b54f0 = function(arg0) { 562 | var ret = getObject(arg0).clientY; 563 | return ret; 564 | }; 565 | imports.wbg.__wbg_ctrlKey_0b565cc670a6a49b = function(arg0) { 566 | var ret = getObject(arg0).ctrlKey; 567 | return ret; 568 | }; 569 | imports.wbg.__wbg_metaKey_a3c6ad6306b6adc3 = function(arg0) { 570 | var ret = getObject(arg0).metaKey; 571 | return ret; 572 | }; 573 | imports.wbg.__wbg_button_e27f6f9aa0a0c496 = function(arg0) { 574 | var ret = getObject(arg0).button; 575 | return ret; 576 | }; 577 | imports.wbg.__wbg_data_327df0625d734e68 = function(arg0, arg1) { 578 | var ret = getObject(arg1).data; 579 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 580 | var len0 = WASM_VECTOR_LEN; 581 | getInt32Memory0()[arg0 / 4 + 1] = len0; 582 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 583 | }; 584 | imports.wbg.__wbg_getPropertyValue_937a708feb88202f = function() { return handleError(function (arg0, arg1, arg2, arg3) { 585 | var ret = getObject(arg1).getPropertyValue(getStringFromWasm0(arg2, arg3)); 586 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 587 | var len0 = WASM_VECTOR_LEN; 588 | getInt32Memory0()[arg0 / 4 + 1] = len0; 589 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 590 | }, arguments) }; 591 | imports.wbg.__wbg_setProperty_dccccce3a52c26db = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 592 | getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 593 | }, arguments) }; 594 | imports.wbg.__wbg_deltaX_d726e0224b540206 = function(arg0) { 595 | var ret = getObject(arg0).deltaX; 596 | return ret; 597 | }; 598 | imports.wbg.__wbg_deltaY_7374d71292d30408 = function(arg0) { 599 | var ret = getObject(arg0).deltaY; 600 | return ret; 601 | }; 602 | imports.wbg.__wbg_deltaMode_01cad379615c05f4 = function(arg0) { 603 | var ret = getObject(arg0).deltaMode; 604 | return ret; 605 | }; 606 | imports.wbg.__wbg_writeText_24e516a13acdea5a = function(arg0, arg1, arg2) { 607 | var ret = getObject(arg0).writeText(getStringFromWasm0(arg1, arg2)); 608 | return addHeapObject(ret); 609 | }; 610 | imports.wbg.__wbg_addEventListener_936431894dca4639 = function() { return handleError(function (arg0, arg1, arg2, arg3) { 611 | getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); 612 | }, arguments) }; 613 | imports.wbg.__wbg_matches_4b1ac237ba413336 = function(arg0) { 614 | var ret = getObject(arg0).matches; 615 | return ret; 616 | }; 617 | imports.wbg.__wbindgen_object_clone_ref = function(arg0) { 618 | var ret = getObject(arg0); 619 | return addHeapObject(ret); 620 | }; 621 | imports.wbg.__wbg_keyCode_218ac9c01e06b3d5 = function(arg0) { 622 | var ret = getObject(arg0).keyCode; 623 | return ret; 624 | }; 625 | imports.wbg.__wbg_altKey_5136125f8a64c2cf = function(arg0) { 626 | var ret = getObject(arg0).altKey; 627 | return ret; 628 | }; 629 | imports.wbg.__wbg_ctrlKey_8fa508d0b540bc8f = function(arg0) { 630 | var ret = getObject(arg0).ctrlKey; 631 | return ret; 632 | }; 633 | imports.wbg.__wbg_shiftKey_21477313df4f5291 = function(arg0) { 634 | var ret = getObject(arg0).shiftKey; 635 | return ret; 636 | }; 637 | imports.wbg.__wbg_metaKey_d60075e40f8f06d7 = function(arg0) { 638 | var ret = getObject(arg0).metaKey; 639 | return ret; 640 | }; 641 | imports.wbg.__wbg_isComposing_615e6dcf813b18db = function(arg0) { 642 | var ret = getObject(arg0).isComposing; 643 | return ret; 644 | }; 645 | imports.wbg.__wbg_key_6827d862c9cc3928 = function(arg0, arg1) { 646 | var ret = getObject(arg1).key; 647 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 648 | var len0 = WASM_VECTOR_LEN; 649 | getInt32Memory0()[arg0 / 4 + 1] = len0; 650 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 651 | }; 652 | imports.wbg.__wbg_now_44a034aa2e1d73dd = function(arg0) { 653 | var ret = getObject(arg0).now(); 654 | return ret; 655 | }; 656 | imports.wbg.__wbg_identifier_870445e138e72c62 = function(arg0) { 657 | var ret = getObject(arg0).identifier; 658 | return ret; 659 | }; 660 | imports.wbg.__wbg_pageX_902206703620e827 = function(arg0) { 661 | var ret = getObject(arg0).pageX; 662 | return ret; 663 | }; 664 | imports.wbg.__wbg_pageY_e4ea57875008005e = function(arg0) { 665 | var ret = getObject(arg0).pageY; 666 | return ret; 667 | }; 668 | imports.wbg.__wbg_force_f238c10135f8fdbc = function(arg0) { 669 | var ret = getObject(arg0).force; 670 | return ret; 671 | }; 672 | imports.wbg.__wbg_length_7cbe32a18202018e = function(arg0) { 673 | var ret = getObject(arg0).length; 674 | return ret; 675 | }; 676 | imports.wbg.__wbg_item_d23780e616aa6e88 = function(arg0, arg1) { 677 | var ret = getObject(arg0).item(arg1 >>> 0); 678 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 679 | }; 680 | imports.wbg.__wbg_get_73dc28e00ffaad3c = function(arg0, arg1) { 681 | var ret = getObject(arg0)[arg1 >>> 0]; 682 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 683 | }; 684 | imports.wbg.__wbg_body_525168d9e773c3f8 = function(arg0) { 685 | var ret = getObject(arg0).body; 686 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 687 | }; 688 | imports.wbg.__wbg_createElement_ac65a6ce60c4812c = function() { return handleError(function (arg0, arg1, arg2) { 689 | var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2)); 690 | return addHeapObject(ret); 691 | }, arguments) }; 692 | imports.wbg.__wbg_getElementById_b180ea4ada06a837 = function(arg0, arg1, arg2) { 693 | var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2)); 694 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 695 | }; 696 | imports.wbg.__wbg_setid_cea8de140a58c4f1 = function(arg0, arg1, arg2) { 697 | getObject(arg0).id = getStringFromWasm0(arg1, arg2); 698 | }; 699 | imports.wbg.__wbg_scrollLeft_12724e899fab9019 = function(arg0) { 700 | var ret = getObject(arg0).scrollLeft; 701 | return ret; 702 | }; 703 | imports.wbg.__wbg_getBoundingClientRect_dbd899b7c945c55d = function(arg0) { 704 | var ret = getObject(arg0).getBoundingClientRect(); 705 | return addHeapObject(ret); 706 | }; 707 | imports.wbg.__wbg_instanceof_WebGlRenderingContext_c86a7d34366b6a22 = function(arg0) { 708 | var ret = getObject(arg0) instanceof WebGLRenderingContext; 709 | return ret; 710 | }; 711 | imports.wbg.__wbg_drawingBufferWidth_251cf4c11b8fe3b7 = function(arg0) { 712 | var ret = getObject(arg0).drawingBufferWidth; 713 | return ret; 714 | }; 715 | imports.wbg.__wbg_drawingBufferHeight_b65221325b738d84 = function(arg0) { 716 | var ret = getObject(arg0).drawingBufferHeight; 717 | return ret; 718 | }; 719 | imports.wbg.__wbg_bufferData_fc1c7f6f7937aa2f = function(arg0, arg1, arg2, arg3) { 720 | getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); 721 | }; 722 | imports.wbg.__wbg_texImage2D_875a12810798bd91 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { 723 | getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); 724 | }, arguments) }; 725 | imports.wbg.__wbg_activeTexture_e014ee7b74cc1fca = function(arg0, arg1) { 726 | getObject(arg0).activeTexture(arg1 >>> 0); 727 | }; 728 | imports.wbg.__wbg_attachShader_6124f72095cdcf11 = function(arg0, arg1, arg2) { 729 | getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); 730 | }; 731 | imports.wbg.__wbg_bindBuffer_275d909129fba2de = function(arg0, arg1, arg2) { 732 | getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); 733 | }; 734 | imports.wbg.__wbg_bindTexture_f00c4b7db89d6a11 = function(arg0, arg1, arg2) { 735 | getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); 736 | }; 737 | imports.wbg.__wbg_blendFunc_75a5af348aa4b099 = function(arg0, arg1, arg2) { 738 | getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); 739 | }; 740 | imports.wbg.__wbg_clear_65a182ed82b4f282 = function(arg0, arg1) { 741 | getObject(arg0).clear(arg1 >>> 0); 742 | }; 743 | imports.wbg.__wbg_clearColor_e0034d2b65202787 = function(arg0, arg1, arg2, arg3, arg4) { 744 | getObject(arg0).clearColor(arg1, arg2, arg3, arg4); 745 | }; 746 | imports.wbg.__wbg_compileShader_42fdaee532cdb8e4 = function(arg0, arg1) { 747 | getObject(arg0).compileShader(getObject(arg1)); 748 | }; 749 | imports.wbg.__wbg_createBuffer_3691dcedc890b4e8 = function(arg0) { 750 | var ret = getObject(arg0).createBuffer(); 751 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 752 | }; 753 | imports.wbg.__wbg_createProgram_8edfd62e0586640d = function(arg0) { 754 | var ret = getObject(arg0).createProgram(); 755 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 756 | }; 757 | imports.wbg.__wbg_createShader_7033c38612c5688d = function(arg0, arg1) { 758 | var ret = getObject(arg0).createShader(arg1 >>> 0); 759 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 760 | }; 761 | imports.wbg.__wbg_createTexture_65cc306909332417 = function(arg0) { 762 | var ret = getObject(arg0).createTexture(); 763 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 764 | }; 765 | imports.wbg.__wbg_disable_cb4b0073c4406d0d = function(arg0, arg1) { 766 | getObject(arg0).disable(arg1 >>> 0); 767 | }; 768 | imports.wbg.__wbg_drawElements_4ec52596f5751396 = function(arg0, arg1, arg2, arg3, arg4) { 769 | getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); 770 | }; 771 | imports.wbg.__wbg_enable_8f92d01df1a4c77c = function(arg0, arg1) { 772 | getObject(arg0).enable(arg1 >>> 0); 773 | }; 774 | imports.wbg.__wbg_enableVertexAttribArray_4b127e0ecccd536c = function(arg0, arg1) { 775 | getObject(arg0).enableVertexAttribArray(arg1 >>> 0); 776 | }; 777 | imports.wbg.__wbg_getAttribLocation_e3a341ce3579c6e6 = function(arg0, arg1, arg2, arg3) { 778 | var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 779 | return ret; 780 | }; 781 | imports.wbg.__wbg_getProgramInfoLog_0b10742df7a2ebea = function(arg0, arg1, arg2) { 782 | var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); 783 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 784 | var len0 = WASM_VECTOR_LEN; 785 | getInt32Memory0()[arg0 / 4 + 1] = len0; 786 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 787 | }; 788 | imports.wbg.__wbg_getProgramParameter_bb277a1d000dd7a1 = function(arg0, arg1, arg2) { 789 | var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); 790 | return addHeapObject(ret); 791 | }; 792 | imports.wbg.__wbg_getShaderInfoLog_950ab0c3fc7afa37 = function(arg0, arg1, arg2) { 793 | var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); 794 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 795 | var len0 = WASM_VECTOR_LEN; 796 | getInt32Memory0()[arg0 / 4 + 1] = len0; 797 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 798 | }; 799 | imports.wbg.__wbg_getShaderParameter_54891c5545a79869 = function(arg0, arg1, arg2) { 800 | var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); 801 | return addHeapObject(ret); 802 | }; 803 | imports.wbg.__wbg_getUniformLocation_8b0d07c81923dc0a = function(arg0, arg1, arg2, arg3) { 804 | var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 805 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 806 | }; 807 | imports.wbg.__wbg_linkProgram_0be4bd888f743eb0 = function(arg0, arg1) { 808 | getObject(arg0).linkProgram(getObject(arg1)); 809 | }; 810 | imports.wbg.__wbg_scissor_0a69745d4b30dc5a = function(arg0, arg1, arg2, arg3, arg4) { 811 | getObject(arg0).scissor(arg1, arg2, arg3, arg4); 812 | }; 813 | imports.wbg.__wbg_shaderSource_c666880b620c8f34 = function(arg0, arg1, arg2, arg3) { 814 | getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); 815 | }; 816 | imports.wbg.__wbg_texParameteri_dd58ff2ef56511b2 = function(arg0, arg1, arg2, arg3) { 817 | getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); 818 | }; 819 | imports.wbg.__wbg_uniform1i_e39f64f3710aa2dc = function(arg0, arg1, arg2) { 820 | getObject(arg0).uniform1i(getObject(arg1), arg2); 821 | }; 822 | imports.wbg.__wbg_uniform2f_82d8cb2acf928fdc = function(arg0, arg1, arg2, arg3) { 823 | getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); 824 | }; 825 | imports.wbg.__wbg_useProgram_fb4984fb080bcd61 = function(arg0, arg1) { 826 | getObject(arg0).useProgram(getObject(arg1)); 827 | }; 828 | imports.wbg.__wbg_vertexAttribPointer_d00262e9bf7a3742 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { 829 | getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); 830 | }; 831 | imports.wbg.__wbg_viewport_39356c8cdec98b8b = function(arg0, arg1, arg2, arg3, arg4) { 832 | getObject(arg0).viewport(arg1, arg2, arg3, arg4); 833 | }; 834 | imports.wbg.__wbg_error_d95afd6217cfd219 = function(arg0) { 835 | console.error(getObject(arg0)); 836 | }; 837 | imports.wbg.__wbg_log_9a99fb1af846153b = function(arg0) { 838 | console.log(getObject(arg0)); 839 | }; 840 | imports.wbg.__wbg_warn_b39e749f1dc02058 = function(arg0) { 841 | console.warn(getObject(arg0)); 842 | }; 843 | imports.wbg.__wbg_scrollTop_48a9fc126383767d = function(arg0) { 844 | var ret = getObject(arg0).scrollTop; 845 | return ret; 846 | }; 847 | imports.wbg.__wbg_hidden_4ee4c56ccb618f43 = function(arg0) { 848 | var ret = getObject(arg0).hidden; 849 | return ret; 850 | }; 851 | imports.wbg.__wbg_sethidden_4e6127e185ecf2df = function(arg0, arg1) { 852 | getObject(arg0).hidden = arg1 !== 0; 853 | }; 854 | imports.wbg.__wbg_style_25309daade79abb3 = function(arg0) { 855 | var ret = getObject(arg0).style; 856 | return addHeapObject(ret); 857 | }; 858 | imports.wbg.__wbg_offsetTop_c8896829575199ae = function(arg0) { 859 | var ret = getObject(arg0).offsetTop; 860 | return ret; 861 | }; 862 | imports.wbg.__wbg_offsetLeft_d2ef32e9fc657e70 = function(arg0) { 863 | var ret = getObject(arg0).offsetLeft; 864 | return ret; 865 | }; 866 | imports.wbg.__wbg_offsetWidth_7dd96a3df070d552 = function(arg0) { 867 | var ret = getObject(arg0).offsetWidth; 868 | return ret; 869 | }; 870 | imports.wbg.__wbg_blur_b336d41728268f5a = function() { return handleError(function (arg0) { 871 | getObject(arg0).blur(); 872 | }, arguments) }; 873 | imports.wbg.__wbg_focus_2fac919cca20d33b = function() { return handleError(function (arg0) { 874 | getObject(arg0).focus(); 875 | }, arguments) }; 876 | imports.wbg.__wbg_instanceof_HtmlInputElement_df6fbc606ba24e20 = function(arg0) { 877 | var ret = getObject(arg0) instanceof HTMLInputElement; 878 | return ret; 879 | }; 880 | imports.wbg.__wbg_setautofocus_700ebffe64c7c2a3 = function(arg0, arg1) { 881 | getObject(arg0).autofocus = arg1 !== 0; 882 | }; 883 | imports.wbg.__wbg_setsize_b6692780c79d2467 = function(arg0, arg1) { 884 | getObject(arg0).size = arg1 >>> 0; 885 | }; 886 | imports.wbg.__wbg_value_f4c762446c572119 = function(arg0, arg1) { 887 | var ret = getObject(arg1).value; 888 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 889 | var len0 = WASM_VECTOR_LEN; 890 | getInt32Memory0()[arg0 / 4 + 1] = len0; 891 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 892 | }; 893 | imports.wbg.__wbg_setvalue_65a652cfd99c8a4a = function(arg0, arg1, arg2) { 894 | getObject(arg0).value = getStringFromWasm0(arg1, arg2); 895 | }; 896 | imports.wbg.__wbg_type_55a19f61b3198ce6 = function(arg0, arg1) { 897 | var ret = getObject(arg1).type; 898 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 899 | var len0 = WASM_VECTOR_LEN; 900 | getInt32Memory0()[arg0 / 4 + 1] = len0; 901 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 902 | }; 903 | imports.wbg.__wbg_preventDefault_7c4d18eb2bb1a26a = function(arg0) { 904 | getObject(arg0).preventDefault(); 905 | }; 906 | imports.wbg.__wbg_stopPropagation_11ccdc30c46ad19a = function(arg0) { 907 | getObject(arg0).stopPropagation(); 908 | }; 909 | imports.wbg.__wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792 = function(arg0) { 910 | var ret = getObject(arg0) instanceof HTMLCanvasElement; 911 | return ret; 912 | }; 913 | imports.wbg.__wbg_width_9eb2c66ac9dde633 = function(arg0) { 914 | var ret = getObject(arg0).width; 915 | return ret; 916 | }; 917 | imports.wbg.__wbg_setwidth_f3c88eb520ba8d47 = function(arg0, arg1) { 918 | getObject(arg0).width = arg1 >>> 0; 919 | }; 920 | imports.wbg.__wbg_height_64e5d4222af3fb90 = function(arg0) { 921 | var ret = getObject(arg0).height; 922 | return ret; 923 | }; 924 | imports.wbg.__wbg_setheight_5a1abba41e35c42a = function(arg0, arg1) { 925 | getObject(arg0).height = arg1 >>> 0; 926 | }; 927 | imports.wbg.__wbg_getContext_813df131fcbd6e91 = function() { return handleError(function (arg0, arg1, arg2) { 928 | var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2)); 929 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 930 | }, arguments) }; 931 | imports.wbg.__wbg_top_22e7024d271b5677 = function(arg0) { 932 | var ret = getObject(arg0).top; 933 | return ret; 934 | }; 935 | imports.wbg.__wbg_left_f2f24ba3851b8295 = function(arg0) { 936 | var ret = getObject(arg0).left; 937 | return ret; 938 | }; 939 | imports.wbg.__wbg_touches_976280ecfdead054 = function(arg0) { 940 | var ret = getObject(arg0).touches; 941 | return addHeapObject(ret); 942 | }; 943 | imports.wbg.__wbg_changedTouches_a281259c12af3e85 = function(arg0) { 944 | var ret = getObject(arg0).changedTouches; 945 | return addHeapObject(ret); 946 | }; 947 | imports.wbg.__wbg_call_ba36642bd901572b = function() { return handleError(function (arg0, arg1) { 948 | var ret = getObject(arg0).call(getObject(arg1)); 949 | return addHeapObject(ret); 950 | }, arguments) }; 951 | imports.wbg.__wbg_newnoargs_9fdd8f3961dd1bee = function(arg0, arg1) { 952 | var ret = new Function(getStringFromWasm0(arg0, arg1)); 953 | return addHeapObject(ret); 954 | }; 955 | imports.wbg.__wbg_getHours_97dfe84bae4276f1 = function(arg0) { 956 | var ret = getObject(arg0).getHours(); 957 | return ret; 958 | }; 959 | imports.wbg.__wbg_getMilliseconds_eab6600bacdff779 = function(arg0) { 960 | var ret = getObject(arg0).getMilliseconds(); 961 | return ret; 962 | }; 963 | imports.wbg.__wbg_getMinutes_f3d9099bcf4e42ab = function(arg0) { 964 | var ret = getObject(arg0).getMinutes(); 965 | return ret; 966 | }; 967 | imports.wbg.__wbg_getSeconds_dd69f2cd151dbe65 = function(arg0) { 968 | var ret = getObject(arg0).getSeconds(); 969 | return ret; 970 | }; 971 | imports.wbg.__wbg_new0_85024d5e91a046e9 = function() { 972 | var ret = new Date(); 973 | return addHeapObject(ret); 974 | }; 975 | imports.wbg.__wbg_resolve_cae3d8f752f5db88 = function(arg0) { 976 | var ret = Promise.resolve(getObject(arg0)); 977 | return addHeapObject(ret); 978 | }; 979 | imports.wbg.__wbg_then_c2361a9d5c9a4fcb = function(arg0, arg1) { 980 | var ret = getObject(arg0).then(getObject(arg1)); 981 | return addHeapObject(ret); 982 | }; 983 | imports.wbg.__wbg_then_6c9a4bf55755f9b8 = function(arg0, arg1, arg2) { 984 | var ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); 985 | return addHeapObject(ret); 986 | }; 987 | imports.wbg.__wbg_self_bb69a836a72ec6e9 = function() { return handleError(function () { 988 | var ret = self.self; 989 | return addHeapObject(ret); 990 | }, arguments) }; 991 | imports.wbg.__wbg_window_3304fc4b414c9693 = function() { return handleError(function () { 992 | var ret = window.window; 993 | return addHeapObject(ret); 994 | }, arguments) }; 995 | imports.wbg.__wbg_globalThis_e0d21cabc6630763 = function() { return handleError(function () { 996 | var ret = globalThis.globalThis; 997 | return addHeapObject(ret); 998 | }, arguments) }; 999 | imports.wbg.__wbg_global_8463719227271676 = function() { return handleError(function () { 1000 | var ret = global.global; 1001 | return addHeapObject(ret); 1002 | }, arguments) }; 1003 | imports.wbg.__wbindgen_is_undefined = function(arg0) { 1004 | var ret = getObject(arg0) === undefined; 1005 | return ret; 1006 | }; 1007 | imports.wbg.__wbg_buffer_9e184d6f785de5ed = function(arg0) { 1008 | var ret = getObject(arg0).buffer; 1009 | return addHeapObject(ret); 1010 | }; 1011 | imports.wbg.__wbg_new_aca5aec908023ece = function(arg0) { 1012 | var ret = new Int16Array(getObject(arg0)); 1013 | return addHeapObject(ret); 1014 | }; 1015 | imports.wbg.__wbg_new_e8101319e4cf95fc = function(arg0) { 1016 | var ret = new Uint8Array(getObject(arg0)); 1017 | return addHeapObject(ret); 1018 | }; 1019 | imports.wbg.__wbg_new_d69bbe3db485d457 = function(arg0) { 1020 | var ret = new Float32Array(getObject(arg0)); 1021 | return addHeapObject(ret); 1022 | }; 1023 | imports.wbg.__wbg_subarray_67cca750e048c2bf = function(arg0, arg1, arg2) { 1024 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1025 | return addHeapObject(ret); 1026 | }; 1027 | imports.wbg.__wbg_subarray_901ede8318da52a6 = function(arg0, arg1, arg2) { 1028 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1029 | return addHeapObject(ret); 1030 | }; 1031 | imports.wbg.__wbg_subarray_8a2a686b9381b60f = function(arg0, arg1, arg2) { 1032 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1033 | return addHeapObject(ret); 1034 | }; 1035 | imports.wbg.__wbg_instanceof_Memory_04d3f55ecfcadb62 = function(arg0) { 1036 | var ret = getObject(arg0) instanceof WebAssembly.Memory; 1037 | return ret; 1038 | }; 1039 | imports.wbg.__wbindgen_number_get = function(arg0, arg1) { 1040 | const obj = getObject(arg1); 1041 | var ret = typeof(obj) === 'number' ? obj : undefined; 1042 | getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; 1043 | getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); 1044 | }; 1045 | imports.wbg.__wbindgen_boolean_get = function(arg0) { 1046 | const v = getObject(arg0); 1047 | var ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; 1048 | return ret; 1049 | }; 1050 | imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { 1051 | var ret = debugString(getObject(arg1)); 1052 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 1053 | var len0 = WASM_VECTOR_LEN; 1054 | getInt32Memory0()[arg0 / 4 + 1] = len0; 1055 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 1056 | }; 1057 | imports.wbg.__wbindgen_throw = function(arg0, arg1) { 1058 | throw new Error(getStringFromWasm0(arg0, arg1)); 1059 | }; 1060 | imports.wbg.__wbindgen_rethrow = function(arg0) { 1061 | throw takeObject(arg0); 1062 | }; 1063 | imports.wbg.__wbindgen_memory = function() { 1064 | var ret = wasm.memory; 1065 | return addHeapObject(ret); 1066 | }; 1067 | imports.wbg.__wbindgen_closure_wrapper1066 = function(arg0, arg1, arg2) { 1068 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_24); 1069 | return addHeapObject(ret); 1070 | }; 1071 | imports.wbg.__wbindgen_closure_wrapper1067 = function(arg0, arg1, arg2) { 1072 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_27); 1073 | return addHeapObject(ret); 1074 | }; 1075 | imports.wbg.__wbindgen_closure_wrapper1069 = function(arg0, arg1, arg2) { 1076 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_30); 1077 | return addHeapObject(ret); 1078 | }; 1079 | imports.wbg.__wbindgen_closure_wrapper1071 = function(arg0, arg1, arg2) { 1080 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_33); 1081 | return addHeapObject(ret); 1082 | }; 1083 | imports.wbg.__wbindgen_closure_wrapper1073 = function(arg0, arg1, arg2) { 1084 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_36); 1085 | return addHeapObject(ret); 1086 | }; 1087 | imports.wbg.__wbindgen_closure_wrapper1075 = function(arg0, arg1, arg2) { 1088 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_39); 1089 | return addHeapObject(ret); 1090 | }; 1091 | imports.wbg.__wbindgen_closure_wrapper1078 = function(arg0, arg1, arg2) { 1092 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_42); 1093 | return addHeapObject(ret); 1094 | }; 1095 | imports.wbg.__wbindgen_closure_wrapper1080 = function(arg0, arg1, arg2) { 1096 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_45); 1097 | return addHeapObject(ret); 1098 | }; 1099 | imports.wbg.__wbindgen_closure_wrapper1082 = function(arg0, arg1, arg2) { 1100 | var ret = makeMutClosure(arg0, arg1, 343, __wbg_adapter_48); 1101 | return addHeapObject(ret); 1102 | }; 1103 | imports.wbg.__wbindgen_closure_wrapper1268 = function(arg0, arg1, arg2) { 1104 | var ret = makeMutClosure(arg0, arg1, 437, __wbg_adapter_51); 1105 | return addHeapObject(ret); 1106 | }; 1107 | 1108 | if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { 1109 | input = fetch(input); 1110 | } 1111 | 1112 | 1113 | 1114 | const { instance, module } = await load(await input, imports); 1115 | 1116 | wasm = instance.exports; 1117 | init.__wbindgen_wasm_module = module; 1118 | 1119 | return wasm; 1120 | } 1121 | 1122 | wasm_bindgen = Object.assign(init, __exports); 1123 | 1124 | })(); 1125 | -------------------------------------------------------------------------------- /docs/hompy_bg.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet/Zac/1515668b08046e5e2c8d22e45aa8a3af3d24fb2e/docs/hompy_bg.wasm -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | smt hompy 10 | 39 | 40 | 41 | 42 | 43 | 44 | 56 | 57 | 58 | 59 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /examples/GoL.zac: -------------------------------------------------------------------------------- 1 | // Conway's Game of Life 2 | // 3 | // Play below by running: zac GoL.zac 4 | 5 | // #grid 6 | // ` | * * **** | 7 | // ` | * ******* | 8 | // ` | * ** * ** | 9 | // ` | ** * *** * | 10 | // ` | ** ** * * | 11 | // ` | * * ** *** | 12 | // ` | *** ** *** * | 13 | // ` | **** * ** ** | 14 | // ` |** * * * * | 15 | // ` | * * * * ***** | 16 | // ` | * * *** ** ** * | 17 | // ` | ** ** * * | 18 | // ` | * * * * * | 19 | // ` | ** ** ** * * | 20 | // ` | ** * | 21 | // ` | | 22 | 23 | let pipe = "|" 24 | let star = "*" 25 | let space = " " 26 | 27 | let width = 3 28 | while (#grid(width) != pipe) { 29 | let width = add(width, 1) 30 | } 31 | let width = add(width, -3) 32 | 33 | defn calc_offset(x, y) { 34 | // 3 for the first left bar 35 | let offset = 3 36 | // 1 offset for each left, right pipe and each newline if y > 0 37 | if (y > 0) { 38 | let offset = add(offset, mul(y, 5)) 39 | } 40 | let offset = add(offset, mul(y, width)) 41 | add(offset, x) 42 | } 43 | 44 | defn get_cell(x, y) { 45 | #grid(calc_offset(x, y)) 46 | } 47 | 48 | let height = 0 49 | while (not(eq(false, get_cell(0, height)))) { 50 | let height = add(height, 1) 51 | } 52 | 53 | defn get_coord(x, y) { 54 | let ret = 0 55 | let char = get_cell(x, y) 56 | if (eq(char, star)) { 57 | let ret = 1 58 | } 59 | ret 60 | } 61 | 62 | defn neighbors(x, y) { 63 | let num_alive_neighbs = 0 64 | let dx = -1 65 | while (lt(dx, 2)) { 66 | let dy = -1 67 | while (lt(dy, 2)) { 68 | if (not(and(eq(dx, 0), eq(dy, 0)))) { 69 | let new_x = add(dx, x) 70 | let new_y = add(dy, y) 71 | let num_alive_neighbs = add(num_alive_neighbs, get_coord(new_x, new_y)) 72 | } 73 | let dy = add(dy, 1) 74 | } 75 | let dx = add(dx, 1) 76 | } 77 | num_alive_neighbs 78 | } 79 | 80 | let new_grid = #grid 81 | let x = 0 82 | let y = 0 83 | while (lt(y, height)) { 84 | let x = 0 85 | while (lt(x, width)) { 86 | let next_char = space 87 | 88 | let this = get_coord(x, y) 89 | let num_neighbors = neighbors(x, y) 90 | 91 | // Any live cell with two or three live neighbours survives. 92 | // Any dead cell with three live neighbours becomes a live cell. 93 | // All other live cells die in the next generation. Similarly, all other dead cells stay dead. 94 | if (and(eq(this, 1), or(eq(num_neighbors, 2), eq(num_neighbors, 3)))) { 95 | let next_char = star 96 | } 97 | 98 | if (and(eq(this, 0), eq(num_neighbors, 3))) { 99 | let next_char = star 100 | } 101 | 102 | // we don't have to set every cell, an option to fix here if it's too slow 103 | let offset = calc_offset(x, y) 104 | let new_grid = set(new_grid, offset, next_char) 105 | 106 | let x = add(x, 1) 107 | } 108 | let y = add(y, 1) 109 | } 110 | 111 | let #grid = new_grid 112 | -------------------------------------------------------------------------------- /examples/fib.zac: -------------------------------------------------------------------------------- 1 | // The code in this file produced and wrote the fibonacci sequence you see below: 2 | 3 | // #fib 4 | 5 | let counter = 0 6 | let end = 10 7 | 8 | let #fib = // Here are the first few numbers: 9 | // 10 | 11 | let a = 1 12 | let b = 1 13 | let temp = 1 14 | 15 | while (counter != end) { 16 | let counter = counter + 1 17 | let temp = a + b 18 | let a = b 19 | let b = temp 20 | 21 | let #fib = cat(#fib, show(a), chr(10)) 22 | } 23 | -------------------------------------------------------------------------------- /examples/hello.zac: -------------------------------------------------------------------------------- 1 | // #hello 2 | 3 | let #hello = // Hello, World!!!! 4 | -------------------------------------------------------------------------------- /examples/help.zac: -------------------------------------------------------------------------------- 1 | // What the heck is an interactive scripting language? 2 | 3 | // #help 4 | -------------------------------------------------------------------------------- /src/interp.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{anyhow, bail}; 2 | use dyn_partial_eq::*; 3 | use std::collections::{BTreeMap, BTreeSet, HashMap}; 4 | 5 | use crate::parser::{ 6 | Assignment, BinOp, Block, Comment, Expr, ExprID, FunctionCall, If, Op, Ref, While, 7 | }; 8 | use crate::{parser, wrapping}; 9 | use dyn_clone::DynClone; 10 | use itertools::Itertools; 11 | use lazy_static::lazy_static; 12 | use std::cell::RefCell; 13 | use std::cmp::Ordering; 14 | use std::fmt::Debug; 15 | use std::rc::Rc; 16 | use std::str::from_utf8; 17 | use std::sync::Mutex; 18 | 19 | #[derive(Debug, Clone)] 20 | pub struct Interpreter { 21 | scope: Rc>, 22 | comments: Rc>>, 23 | pub(crate) result_comments: Rc>>, 24 | } 25 | 26 | const BUILTIN_COMMENTS: &[&str; 2] = &["help", "example-function"]; 27 | pub fn builtin_comment(interpreter: &Interpreter, name: &str) -> Option { 28 | match name { 29 | "help" => Some(generate_help_text(interpreter)), 30 | "example-function" => Some( 31 | r#"The following function computes the nth value in the Fibonacci sequence: 32 | 33 | ` defn fib(n) { 34 | ` let a = 1 35 | ` let b = 1 36 | ` let temp = 1 37 | ` let i = 0 38 | ` while (i < n) { 39 | ` let temp = a + b 40 | ` let a = b 41 | ` let b = temp 42 | ` let i = i + 1 43 | ` } 44 | ` a 45 | ` }"# 46 | .to_string(), 47 | ), 48 | _ => None, 49 | } 50 | } 51 | 52 | lazy_static! { 53 | static ref BUILTIN_CONSTANTS: Mutex> = { 54 | let mut map = BTreeMap::new(); 55 | map.insert("true".to_string(), Value::Bool(true)); 56 | map.insert("false".to_string(), Value::Bool(false)); 57 | Mutex::new(map) 58 | }; 59 | } 60 | 61 | impl Interpreter { 62 | pub fn new() -> Self { 63 | let mut scope = Scope::new(None); 64 | scope.insert("set".into(), Value::Function(Box::new(SetBuiltin {}))); 65 | scope.insert("add".into(), Value::Function(Box::new(AddBuiltin {}))); 66 | scope.insert("mul".into(), Value::Function(Box::new(MulBuiltin {}))); 67 | scope.insert("eq".into(), Value::Function(Box::new(EqBuiltin {}))); 68 | scope.insert("lt".into(), Value::Function(Box::new(LtBuiltin {}))); 69 | scope.insert("gt".into(), Value::Function(Box::new(GtBuiltin {}))); 70 | scope.insert("not".into(), Value::Function(Box::new(NotBuiltin {}))); 71 | scope.insert("and".into(), Value::Function(Box::new(AndBuiltin {}))); 72 | scope.insert("or".into(), Value::Function(Box::new(OrBuiltin {}))); 73 | scope.insert("print".into(), Value::Function(Box::new(PrintBuiltin {}))); 74 | scope.insert("show".into(), Value::Function(Box::new(ShowBuiltin {}))); 75 | scope.insert("chr".into(), Value::Function(Box::new(ChrBuiltin {}))); 76 | scope.insert("cat".into(), Value::Function(Box::new(CatBuiltin {}))); 77 | BUILTIN_CONSTANTS.lock().unwrap().iter().for_each(|(k, v)| { 78 | scope.insert(k.clone(), v.clone()); 79 | }); 80 | 81 | Self { 82 | result_comments: Rc::new(RefCell::new(HashMap::new())), 83 | scope: Rc::new(RefCell::new(scope)), 84 | comments: Rc::new(RefCell::new(BTreeMap::new())), 85 | } 86 | } 87 | 88 | pub fn new_scope(&self) -> Self { 89 | let new_scope = Scope::new(Some(Rc::clone(&self.scope))); 90 | let mut new_interp = self.clone(); 91 | new_interp.scope = Rc::new(RefCell::new(new_scope)); 92 | new_interp 93 | } 94 | 95 | pub fn comments(&self) -> Vec<(String, String)> { 96 | self.comments 97 | .borrow() 98 | .iter() 99 | .map(|(k, v)| (k.to_string(), v.to_string())) 100 | .collect() 101 | } 102 | 103 | pub fn add_comment(&mut self, comment: &Comment) -> anyhow::Result<()> { 104 | if let Some(name) = &comment.name { 105 | let mut comments = self.comments.borrow_mut(); 106 | if comments.contains_key(name) { 107 | bail!("duplicate comment: {}", name); 108 | } 109 | comments.insert(name.into(), comment.body.clone()); 110 | } 111 | Ok(()) 112 | } 113 | 114 | pub fn interp(&mut self, expr: &Expr) -> anyhow::Result { 115 | let val = match expr { 116 | Expr::Block(block) => { 117 | let mut exprs = block.exprs(); 118 | let first = exprs 119 | .next() 120 | .ok_or_else(|| anyhow!("a block can't be empty"))?; 121 | let mut res = self.interp(first)?; 122 | for expr in exprs { 123 | res = self.interp(expr)?; 124 | } 125 | res 126 | } 127 | Expr::Comment(Comment { name: _, body }) => Value::String(body.into()), 128 | Expr::Assignment(Assignment { r#ref, expr }) => { 129 | let val = self.interp(expr)?; 130 | match r#ref { 131 | Ref::CommentRef(comment_name) => { 132 | let mut comments = self.comments.borrow_mut(); 133 | let comment = comments.get_mut(comment_name).ok_or_else(|| { 134 | anyhow!("couldn't find comment with name {}", comment_name) 135 | })?; 136 | *comment = wrapping::stringify(&val); 137 | } 138 | Ref::VarRef(name) => { 139 | self.scope.borrow_mut().insert(name.into(), val.clone()); 140 | } 141 | } 142 | val 143 | } 144 | Expr::IntLiteral(n) => Value::Int(*n), 145 | Expr::Ref(r#ref) => self.get_ref(r#ref)?, 146 | // XXX: 147 | // this is lols but we'll use func call syntax to index into strings and maps 148 | // (don't have lists yet) 149 | Expr::FunctionCall(FunctionCall { r#ref, args }) => { 150 | let var = self.get_ref(r#ref)?; 151 | let args = args 152 | .iter() 153 | .map(|e| self.interp(e)) 154 | .collect::>>()?; 155 | match var { 156 | Value::Function(func) => func.call(self, &args)?, 157 | Value::String(s) => { 158 | let index = get_arg(&args, 0)?.as_num()?; 159 | if index < 0 { 160 | Value::Bool(false) 161 | } else { 162 | s.chars() 163 | .nth(index as usize) 164 | .map(|c| Value::String(c.into())) 165 | .unwrap_or(Value::Bool(false)) 166 | } 167 | } 168 | Value::Map(map) => { 169 | let key = get_arg(&args, 0)?; 170 | map.get(key).cloned().unwrap_or(Value::Bool(false)) 171 | } 172 | Value::Bool(_) | Value::Int(_) => { 173 | bail!("tried to call a {:?}", var) 174 | } 175 | Value::List(vals) => { 176 | let index = get_arg(&args, 0)?.as_num()?; 177 | vals.get(index as usize) 178 | .cloned() 179 | .unwrap_or(Value::Bool(false)) 180 | } 181 | } 182 | } 183 | Expr::While(While { cond, block }) => { 184 | // TODO: need to make aa new scope for a new block 185 | let mut count = 0; 186 | while self.interp(cond)?.as_bool()? { 187 | self.interp(&Expr::Block(block.clone()))?; 188 | count += 1; 189 | } 190 | Value::Int(count) 191 | } 192 | Expr::If(If { cond, block }) => { 193 | // TODO: need to make aa new scope for a new block 194 | let b = self.interp(cond)?.as_bool()?; 195 | if b { 196 | self.interp(&Expr::Block(block.clone()))?; 197 | } 198 | Value::Bool(b) 199 | } 200 | Expr::FuncDef(func_def) => { 201 | let val = Value::Function(Box::new(FuncDef::from_expr(func_def.clone()))); 202 | self.scope 203 | .borrow_mut() 204 | .insert(func_def.name.clone(), val.clone()); 205 | val 206 | } 207 | Expr::ListLiteral(exprs) => Value::List( 208 | exprs 209 | .iter() 210 | .map(|expr| self.interp(expr)) 211 | .collect::>>()?, 212 | ), 213 | Expr::BinOp(BinOp { op, lhs, rhs }) => self.eval_bin_op(lhs, *op, rhs)?, 214 | Expr::StringLiteral(s) => Value::String(s.into()), 215 | Expr::ResultComment(id, expr) => { 216 | let val = self.interp(expr)?; 217 | let mut comments = self.result_comments.borrow_mut(); 218 | comments.insert(id.clone(), val.clone()); 219 | val 220 | } 221 | }; 222 | Ok(val) 223 | } 224 | 225 | fn eval_bin_op(&mut self, lhs: &Box, op: Op, rhs: &Box) -> anyhow::Result { 226 | let lhs = self.interp(lhs)?; 227 | let rhs = self.interp(rhs)?; 228 | Ok(match op { 229 | Op::Add => match (lhs, rhs) { 230 | (Value::Int(l), Value::Int(r)) => Value::Int(l + r), 231 | (Value::String(l), Value::String(r)) => Value::String(l + &r), 232 | (Value::List(l), Value::List(r)) => Value::List(l.into_iter().chain(r).collect()), 233 | (Value::Map(l), Value::Map(r)) => Value::Map(l.into_iter().chain(r).collect()), 234 | (Value::Bool(l), Value::Bool(r)) => Value::Bool(l || r), 235 | (l, r) => bail!("can't add {:?} and {:?}", l, r), 236 | }, 237 | Op::Sub => match (lhs, rhs) { 238 | (Value::Int(l), Value::Int(r)) => Value::Int(l - r), 239 | (l, r) => bail!("can't subtract {:?} and {:?}", l, r), 240 | }, 241 | Op::Div => match (lhs, rhs) { 242 | (Value::Int(l), Value::Int(r)) => Value::Int(l / r), 243 | (l, r) => bail!("can't divide {:?} and {:?}", l, r), 244 | }, 245 | Op::Mul => match (lhs, rhs) { 246 | (Value::Int(l), Value::Int(r)) => Value::Int(l * r), 247 | (l, r) => bail!("can't multiply {:?} and {:?}", l, r), 248 | }, 249 | Op::And => Value::Bool(lhs.as_bool()? && rhs.as_bool()?), 250 | Op::Or => Value::Bool(lhs.as_bool()? || rhs.as_bool()?), 251 | Op::Eq => Value::Bool(lhs == rhs), 252 | Op::Neq => Value::Bool(lhs != rhs), 253 | Op::Gte => match (lhs, rhs) { 254 | (Value::Int(l), Value::Int(r)) => Value::Bool(l >= r), 255 | (l, r) => bail!("can't compare {:?} >= {:?}", l, r), 256 | }, 257 | Op::Gt => match (lhs, rhs) { 258 | (Value::Int(l), Value::Int(r)) => Value::Bool(l > r), 259 | (l, r) => bail!("can't compare {:?} > {:?}", l, r), 260 | }, 261 | Op::Lte => match (lhs, rhs) { 262 | (Value::Int(l), Value::Int(r)) => Value::Bool(l <= r), 263 | (l, r) => bail!("can't compare {:?} <= {:?}", l, r), 264 | }, 265 | Op::Lt => match (lhs, rhs) { 266 | (Value::Int(l), Value::Int(r)) => Value::Bool(l < r), 267 | (l, r) => bail!("can't compare {:?} < {:?}", l, r), 268 | }, 269 | }) 270 | } 271 | 272 | // TODO: this should probably be a refcell 273 | fn get_ref(&self, r#ref: &Ref) -> anyhow::Result { 274 | match r#ref { 275 | Ref::CommentRef(name) => { 276 | let comment_body = self 277 | .comments 278 | .borrow() 279 | .get(name) 280 | .ok_or_else(|| anyhow!("undefined comment {}", name))? 281 | .clone(); 282 | Ok(Value::String(comment_body)) 283 | } 284 | Ref::VarRef(name) => self 285 | .scope 286 | .borrow() 287 | .get(name) 288 | .ok_or_else(|| anyhow!("undefined name {}", name)) 289 | .map(|val| val.clone()), 290 | } 291 | } 292 | } 293 | 294 | #[derive(Debug)] 295 | struct Scope { 296 | prev: Option>>, 297 | this: BTreeMap, 298 | } 299 | 300 | impl Scope { 301 | fn new(prev: Option>>) -> Self { 302 | Self { 303 | prev, 304 | this: Default::default(), 305 | } 306 | } 307 | 308 | pub fn insert(&mut self, name: String, val: Value) { 309 | self.this.insert(name, val); 310 | } 311 | 312 | pub fn get(&self, name: &str) -> Option { 313 | if let Some(val) = self.this.get(name) { 314 | return Some(val.clone()); 315 | } 316 | 317 | self.prev 318 | .as_ref() 319 | .and_then(|scope| scope.borrow().get(name)) 320 | } 321 | } 322 | 323 | #[dyn_partial_eq] 324 | pub trait Function: Debug + DynClone + Send { 325 | fn call(&self, interp: &mut Interpreter, args: &[Value]) -> anyhow::Result; 326 | } 327 | 328 | dyn_clone::clone_trait_object!(Function); 329 | 330 | #[derive(Debug, Clone, PartialEq)] 331 | pub enum Value { 332 | String(String), 333 | Map(BTreeMap), 334 | Int(i128), 335 | Function(Box), 336 | Bool(bool), 337 | List(Vec), 338 | } 339 | 340 | impl Eq for Value {} 341 | 342 | impl PartialOrd for Value { 343 | fn partial_cmp(&self, other: &Self) -> Option { 344 | match (self, other) { 345 | (Value::Int(a), Value::Int(b)) => a.partial_cmp(b), 346 | (Value::String(a), Value::String(b)) => a.partial_cmp(b), 347 | (Value::Bool(a), Value::Bool(b)) => a.partial_cmp(b), 348 | (Value::List(a), Value::List(b)) => a.partial_cmp(b), 349 | (Value::Map(a), Value::Map(b)) => a.partial_cmp(b), 350 | _ => None, 351 | } 352 | } 353 | } 354 | 355 | impl Ord for Value { 356 | fn cmp(&self, other: &Self) -> Ordering { 357 | match (self, other) { 358 | (Value::Int(a), Value::Int(b)) => a.cmp(b), 359 | (Value::String(a), Value::String(b)) => a.cmp(b), 360 | (Value::Bool(a), Value::Bool(b)) => a.cmp(b), 361 | (Value::List(a), Value::List(b)) => a.cmp(b), 362 | (Value::Map(a), Value::Map(b)) => a.cmp(b), 363 | _ => Ordering::Less, 364 | } 365 | } 366 | } 367 | 368 | #[derive(Debug, Clone, PartialEq, DynPartialEq)] 369 | struct FuncDef { 370 | block: Block, 371 | arg_names: Vec, 372 | } 373 | 374 | impl FuncDef { 375 | fn from_expr(func_def: parser::FuncDef) -> Self { 376 | Self { 377 | block: func_def.block, 378 | arg_names: func_def.arg_names, 379 | } 380 | } 381 | } 382 | 383 | impl Function for FuncDef { 384 | fn call(&self, interp: &mut Interpreter, args: &[Value]) -> anyhow::Result { 385 | let mut new_interp = interp.new_scope(); 386 | for (name, val) in self.arg_names.iter().zip(args) { 387 | new_interp 388 | .scope 389 | .borrow_mut() 390 | .insert(name.to_owned(), val.clone()); 391 | } 392 | new_interp.interp(&Expr::Block(self.block.clone())) 393 | } 394 | } 395 | 396 | impl Value { 397 | fn as_func(&self) -> anyhow::Result<&dyn Function> { 398 | match self { 399 | Value::Function(f) => Ok(f.as_ref()), 400 | otherwise => bail!("{:?} is not a function", otherwise), 401 | } 402 | } 403 | 404 | fn as_num(&self) -> anyhow::Result { 405 | match self { 406 | Value::Int(i) => Ok(*i), 407 | otherwise => bail!("{:?} is not an integer", otherwise), 408 | } 409 | } 410 | 411 | fn as_bool(&self) -> anyhow::Result { 412 | match self { 413 | Value::Bool(b) => Ok(*b), 414 | otherwise => bail!("{:?} is not a bool", otherwise), 415 | } 416 | } 417 | 418 | fn as_str(&self) -> anyhow::Result<&str> { 419 | match self { 420 | Value::String(s) => Ok(s), 421 | otherwise => bail!("{:?} is not a String", otherwise), 422 | } 423 | } 424 | } 425 | 426 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 427 | struct SetBuiltin {} 428 | impl Function for SetBuiltin { 429 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 430 | let str = get_arg(args, 0)?.as_str()?; 431 | let index = get_arg(args, 1)?.as_num()?; 432 | let new = get_arg(args, 2)?.as_str()?; 433 | let (left, right) = str.split_at(index as usize); 434 | Ok(Value::String(format!("{}{}{}", left, new, &right[1..]))) 435 | } 436 | } 437 | 438 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 439 | struct AddBuiltin {} 440 | impl Function for AddBuiltin { 441 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 442 | let lhs = get_arg(args, 0)?.as_num()?; 443 | let rhs = get_arg(args, 1)?.as_num()?; 444 | Ok(Value::Int(lhs + rhs)) 445 | } 446 | } 447 | 448 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 449 | struct MulBuiltin {} 450 | impl Function for MulBuiltin { 451 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 452 | let lhs = get_arg(args, 0)?.as_num()?; 453 | let rhs = get_arg(args, 1)?.as_num()?; 454 | Ok(Value::Int(lhs * rhs)) 455 | } 456 | } 457 | 458 | fn get_arg(args: &[Value], n: usize) -> anyhow::Result<&Value> { 459 | args.get(n).ok_or_else(|| { 460 | anyhow!( 461 | "not enough arguments, was looking for {} but only {} were provided", 462 | n, 463 | args.len() 464 | ) 465 | }) 466 | } 467 | 468 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 469 | struct EqBuiltin {} 470 | impl Function for EqBuiltin { 471 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 472 | let lhs = get_arg(args, 0)?; 473 | let rhs = get_arg(args, 1)?; 474 | Ok(Value::Bool(lhs == rhs)) 475 | } 476 | } 477 | 478 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 479 | struct GtBuiltin {} 480 | impl Function for GtBuiltin { 481 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 482 | let lhs = get_arg(args, 0)?.as_num()?; 483 | let rhs = get_arg(args, 1)?.as_num()?; 484 | Ok(Value::Bool(lhs > rhs)) 485 | } 486 | } 487 | 488 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 489 | struct LtBuiltin {} 490 | impl Function for LtBuiltin { 491 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 492 | let lhs = get_arg(args, 0)?.as_num()?; 493 | let rhs = get_arg(args, 1)?.as_num()?; 494 | //println!("{:?} < {:?}", lhs, rhs); 495 | Ok(Value::Bool(lhs < rhs)) 496 | } 497 | } 498 | 499 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 500 | struct NotBuiltin {} 501 | impl Function for NotBuiltin { 502 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 503 | let val = get_arg(args, 0)?.as_bool()?; 504 | Ok(Value::Bool(!val)) 505 | } 506 | } 507 | 508 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 509 | struct AndBuiltin {} 510 | impl Function for AndBuiltin { 511 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 512 | let lhs = get_arg(args, 0)?.as_bool()?; 513 | let rhs = get_arg(args, 1)?.as_bool()?; 514 | Ok(Value::Bool(lhs && rhs)) 515 | } 516 | } 517 | 518 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 519 | struct OrBuiltin {} 520 | impl Function for OrBuiltin { 521 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 522 | let lhs = get_arg(args, 0)?.as_bool()?; 523 | let rhs = get_arg(args, 1)?.as_bool()?; 524 | Ok(Value::Bool(lhs || rhs)) 525 | } 526 | } 527 | 528 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 529 | struct PrintBuiltin {} 530 | impl Function for PrintBuiltin { 531 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 532 | let val = get_arg(args, 0)?; 533 | println!("{:?}", val); 534 | Ok(val.clone()) 535 | } 536 | } 537 | 538 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 539 | struct CatBuiltin {} 540 | impl Function for CatBuiltin { 541 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 542 | let mut acc = String::new(); 543 | for arg in args { 544 | let str = arg.as_str()?; 545 | acc.push_str(str); 546 | } 547 | Ok(Value::String(acc)) 548 | } 549 | } 550 | 551 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 552 | struct ChrBuiltin {} 553 | impl Function for ChrBuiltin { 554 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 555 | let val = get_arg(args, 0)?.as_num()?.to_le_bytes()[0]; 556 | Ok(Value::String(from_utf8(&[val])?.to_string())) 557 | } 558 | } 559 | 560 | #[derive(Debug, Clone, DynPartialEq, PartialEq)] 561 | struct ShowBuiltin {} 562 | impl Function for ShowBuiltin { 563 | fn call(&self, _: &mut Interpreter, args: &[Value]) -> anyhow::Result { 564 | let val = get_arg(args, 0)?; 565 | Ok(Value::String(wrapping::stringify(val))) 566 | } 567 | } 568 | 569 | fn format_comment(s: &str) -> String { 570 | format!("#{}", s) 571 | } 572 | 573 | const WELCOME_TEXT: &str = r#"Help for the Zac Programming Language (https://github.com/sumeet/Zac) 574 | 575 | Define a comment with the first line set to an identifier (like #help) and it 576 | will be a string usable inside of your program. You can read from it, and if 577 | you write to it, the change will be reflected inside the source file."#; 578 | 579 | fn generate_help_text(interp: &Interpreter) -> String { 580 | let mut function_names = vec![]; 581 | let mut variable_names = vec![]; 582 | for (name, global_var_value) in &interp.scope.borrow().this { 583 | if global_var_value.as_func().is_ok() { 584 | function_names.push(name.to_string()); 585 | } else { 586 | if !BUILTIN_CONSTANTS.lock().unwrap().contains_key(name) { 587 | variable_names.push(name.to_string()); 588 | } 589 | } 590 | } 591 | let mut non_builtin_comment_names = BTreeSet::new(); 592 | for comment in interp.comments.borrow().keys() { 593 | if !BUILTIN_COMMENTS.contains(&comment.as_str()) { 594 | non_builtin_comment_names.insert(format_comment(comment)); 595 | } 596 | } 597 | 598 | let mut txt = String::new(); 599 | txt.push_str(WELCOME_TEXT); 600 | txt.push_str("\n\nBuiltin comments:\n"); 601 | let builtin_comments = BUILTIN_COMMENTS 602 | .iter() 603 | .map(|c| format_comment(c)) 604 | .collect::>(); 605 | txt.push_str(&tableize(builtin_comments.iter().map(|s| s.as_str()))); 606 | txt.push_str("\nBuiltin functions:\n"); 607 | txt.push_str(&tableize(function_names.iter().map(|s| s.as_str()))); 608 | txt.push_str("\nBuiltin constants:\n"); 609 | txt.push_str(&tableize( 610 | BUILTIN_CONSTANTS 611 | .lock() 612 | .unwrap() 613 | .iter() 614 | .map(|(k, _)| k.as_str()), 615 | )); 616 | if !variable_names.is_empty() { 617 | txt.push_str("\nAvailable variables:\n"); 618 | txt.push_str(&tableize(variable_names.iter().map(|s| s.as_str()))); 619 | } 620 | if !non_builtin_comment_names.is_empty() { 621 | txt.push_str("\nAvailable comments:\n"); 622 | txt.push_str(&tableize(non_builtin_comment_names.iter().map(|s| s.as_str())).to_string()); 623 | } 624 | txt.trim_end().into() 625 | } 626 | 627 | fn tableize<'a>(mut function_names: impl Iterator) -> String { 628 | format!(" {}", function_names.join(" ")) 629 | } 630 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![feature(exclusive_range_pattern)] 2 | #![feature(map_try_insert)] 3 | #![feature(in_band_lifetimes)] 4 | #![feature(box_syntax)] 5 | 6 | use crate::interp::builtin_comment; 7 | use crate::parser::{find_comments_mut, Expr, Program}; 8 | use crate::wrapping::rewrap; 9 | use anyhow::anyhow; 10 | use interp::Interpreter; 11 | 12 | pub mod interp; 13 | pub mod parser; 14 | pub mod reassemble; 15 | mod wrapping; 16 | 17 | pub fn run(code: &str) -> anyhow::Result { 18 | let mut program = parser::parser::program(code)?; 19 | let mut interp = Interpreter::new(); 20 | for (_, comment) in find_comments_mut(&mut program)? { 21 | interp.add_comment(comment)?; 22 | } 23 | 24 | let block = Expr::Block(program.block.clone()); 25 | interp.interp(&block)?; 26 | 27 | replace_comments_in_source_code(&mut program, &mut interp)?; 28 | 29 | Ok(reassemble::output_code(&program, &interp)) 30 | } 31 | 32 | pub fn replace_comments_in_source_code( 33 | mut program: &mut Program, 34 | interp: &mut Interpreter, 35 | ) -> anyhow::Result<()> { 36 | let mut comments = find_comments_mut(&mut program)?; 37 | for (name, body) in interp.comments().iter() { 38 | let code_comment = comments 39 | .get_mut(name) 40 | .ok_or_else(|| anyhow!("original code didn't contain comment {}", name))?; 41 | code_comment.body = rewrap(&if let Some(builtin) = builtin_comment(interp, name) { 42 | builtin 43 | } else { 44 | body.to_string() 45 | }); 46 | } 47 | Ok(()) 48 | } 49 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![feature(exclusive_range_pattern)] 2 | #![feature(map_try_insert)] 3 | #![feature(in_band_lifetimes)] 4 | #![feature(box_syntax)] 5 | 6 | use anyhow::anyhow; 7 | use std::fs::{read_to_string, File}; 8 | use std::io::{stdout, Write}; 9 | use zac_lib::replace_comments_in_source_code; 10 | 11 | use zac_lib::interp::Interpreter; 12 | use zac_lib::parser; 13 | use zac_lib::parser::{find_comments_mut, Expr}; 14 | use zac_lib::reassemble; 15 | 16 | pub fn main() -> anyhow::Result<()> { 17 | let (filename, is_dry_run) = parse_args()?; 18 | 19 | let input = read_to_string(&filename)?; 20 | let mut program = parser::parser::program(&input)?; 21 | 22 | let mut interp = Interpreter::new(); 23 | for (_, comment) in find_comments_mut(&mut program)? { 24 | interp.add_comment(comment)?; 25 | } 26 | 27 | let block = Expr::Block(program.block.clone()); 28 | interp.interp(&block)?; 29 | 30 | replace_comments_in_source_code(&mut program, &mut interp)?; 31 | 32 | let assembled = reassemble::output_code(&program, &interp); 33 | if is_dry_run { 34 | stdout().lock().write_all(assembled.as_bytes())?; 35 | } else { 36 | File::create(&filename)?.write_all(assembled.as_bytes())?; 37 | } 38 | Ok(()) 39 | } 40 | 41 | fn parse_args() -> anyhow::Result<(String, bool)> { 42 | let mut args = std::env::args(); 43 | let cmd_name = args.next().unwrap(); 44 | let filename = args 45 | .next() 46 | .ok_or_else(|| anyhow!("usage: {} [--dry]", cmd_name))?; 47 | let dry_run = args.next() == Some("--dry".to_string()); 48 | Ok((filename, dry_run)) 49 | } 50 | -------------------------------------------------------------------------------- /src/parser.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{anyhow, bail}; 2 | use itertools::Itertools; 3 | use lazy_static::lazy_static; 4 | use litrs::StringLit; 5 | use std::collections::HashMap; 6 | use std::fmt::{Debug, Display}; 7 | use std::hash::Hash; 8 | use std::sync::Mutex; 9 | 10 | pub type ExprID = usize; 11 | 12 | lazy_static! { 13 | static ref NEXT_ID: Mutex = Mutex::new(0); 14 | } 15 | 16 | fn next_id() -> usize { 17 | let mut next_id = NEXT_ID.lock().unwrap(); 18 | let this_id = *next_id; 19 | *next_id += 1; 20 | this_id 21 | } 22 | 23 | #[derive(Debug)] 24 | pub struct Program { 25 | pub block: Block, 26 | } 27 | 28 | #[derive(Debug, Clone, PartialEq)] 29 | pub struct Block(pub Vec); 30 | 31 | impl Block { 32 | pub fn exprs(&self) -> impl Iterator + '_ { 33 | self.0.iter().filter_map(|block_el| match block_el { 34 | BlockEl::Expr(expr) => Some(expr), 35 | BlockEl::NewLine => None, 36 | }) 37 | } 38 | 39 | pub fn exprs_mut(&mut self) -> impl Iterator + '_ { 40 | self.0.iter_mut().filter_map(|block_el| match block_el { 41 | BlockEl::Expr(expr) => Some(expr), 42 | BlockEl::NewLine => None, 43 | }) 44 | } 45 | } 46 | 47 | #[derive(Debug, Clone, PartialEq)] 48 | pub enum BlockEl { 49 | Expr(Expr), 50 | NewLine, 51 | } 52 | 53 | // TODO: should probably put a concept of newline into here because newlines from the programmer 54 | // are important 55 | #[derive(Debug, Clone, PartialEq)] 56 | pub enum Expr { 57 | Block(Block), 58 | Ref(Ref), 59 | Comment(Comment), 60 | Assignment(Assignment), 61 | IntLiteral(i128), 62 | StringLiteral(String), 63 | ListLiteral(Vec), 64 | FuncDef(FuncDef), 65 | FunctionCall(FunctionCall), 66 | While(While), 67 | If(If), 68 | BinOp(BinOp), 69 | ResultComment(ExprID, Box), 70 | } 71 | 72 | #[derive(Debug, Clone, Copy, PartialEq)] 73 | pub enum Op { 74 | Add, 75 | Sub, 76 | Div, 77 | Mul, 78 | Eq, 79 | Neq, 80 | Gte, 81 | Gt, 82 | Lte, 83 | Lt, 84 | And, 85 | Or, 86 | } 87 | 88 | #[derive(Debug, Clone, PartialEq)] 89 | pub struct BinOp { 90 | pub op: Op, 91 | pub lhs: Box, 92 | pub rhs: Box, 93 | } 94 | 95 | #[derive(Debug, Clone, PartialEq)] 96 | pub struct FuncDef { 97 | pub name: String, 98 | pub arg_names: Vec, 99 | pub block: Block, 100 | } 101 | 102 | #[derive(Debug, Clone, PartialEq)] 103 | pub struct Comment { 104 | pub name: Option, 105 | pub body: String, 106 | } 107 | 108 | pub fn find_comments_mut( 109 | program: &'a mut Program, 110 | ) -> anyhow::Result> { 111 | let mut comments = HashMap::new(); 112 | for expr in &mut program.block.exprs_mut() { 113 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 114 | } 115 | Ok(comments) 116 | } 117 | 118 | fn find_expr_comments_mut(expr: &'a mut Expr) -> anyhow::Result> { 119 | let mut comments = HashMap::new(); 120 | match expr { 121 | Expr::Block(block) => { 122 | for expr in block.exprs_mut() { 123 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 124 | } 125 | } 126 | Expr::Comment(c) => { 127 | let name = c.name.clone(); 128 | if let Some(name) = name { 129 | try_insert(&mut comments, name, c)?; 130 | } 131 | } 132 | Expr::Assignment(Assignment { r#ref: _, expr }) => { 133 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 134 | } 135 | Expr::FunctionCall(FunctionCall { r#ref: _, args }) => { 136 | for expr in args { 137 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 138 | } 139 | } 140 | Expr::While(While { cond, block }) | Expr::If(If { cond, block }) => { 141 | try_extend(&mut comments, &mut find_expr_comments_mut(cond)?)?; 142 | for expr in block.exprs_mut() { 143 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 144 | } 145 | } 146 | Expr::Ref(_) | Expr::IntLiteral(_) | Expr::BinOp(_) | Expr::StringLiteral(_) => {} 147 | Expr::FuncDef(FuncDef { 148 | name: _, 149 | arg_names: _, 150 | block, 151 | }) => { 152 | for expr in block.exprs_mut() { 153 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 154 | } 155 | } 156 | Expr::ListLiteral(exprs) => { 157 | for expr in exprs { 158 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 159 | } 160 | } 161 | Expr::ResultComment(_, expr) => { 162 | try_extend(&mut comments, &mut find_expr_comments_mut(expr)?)?; 163 | } 164 | } 165 | Ok(comments) 166 | } 167 | 168 | pub fn try_extend( 169 | into: &mut HashMap, 170 | from: &mut HashMap, 171 | ) -> anyhow::Result<()> { 172 | for (k, v) in from.drain() { 173 | try_insert(into, k, v)?; 174 | } 175 | Ok(()) 176 | } 177 | 178 | fn try_insert( 179 | into: &mut HashMap, 180 | k: K, 181 | v: &'a mut V, 182 | ) -> anyhow::Result<()> { 183 | if into.contains_key(&k) { 184 | bail!(anyhow!("key {} already exists", k)); 185 | } 186 | into.insert(k, v); 187 | Ok(()) 188 | } 189 | 190 | #[derive(Debug, Clone, PartialEq)] 191 | pub enum Ref { 192 | CommentRef(String), 193 | VarRef(String), 194 | } 195 | 196 | #[derive(Debug, Clone, PartialEq)] 197 | pub struct Assignment { 198 | pub r#ref: Ref, 199 | pub expr: Box, 200 | } 201 | 202 | #[derive(Debug, Clone, PartialEq)] 203 | pub struct FunctionCall { 204 | pub r#ref: Ref, 205 | pub args: Vec, 206 | } 207 | 208 | #[derive(Debug, Clone, PartialEq)] 209 | pub struct While { 210 | pub cond: Box, 211 | pub block: Block, 212 | } 213 | 214 | #[derive(Debug, Clone, PartialEq)] 215 | pub struct If { 216 | pub cond: Box, 217 | pub block: Block, 218 | } 219 | 220 | // usage of peg stolen from https://github.com/A1Liu/gone/blob/master/src/parser.rs 221 | peg::parser! { 222 | pub grammar parser() for str { 223 | pub rule program() -> Program 224 | = block:block() { Program { block } } 225 | 226 | rule block() -> Block 227 | = block_els:(block_el()+) { Block(block_els) } 228 | 229 | rule block_el() -> BlockEl 230 | = nbspace()? b:(block_el_expr() / block_el_blankline()) { b } 231 | 232 | rule block_el_expr() -> BlockEl 233 | = e:expr() { BlockEl::Expr(e) } 234 | 235 | rule block_el_blankline() -> BlockEl 236 | = newline() { BlockEl::NewLine } 237 | 238 | rule func_decl() -> Expr 239 | = "defn" _? name:ident() _? "(" _? arg_names:(ident() ** comma()) _? ")" _* "{" _? block:block() _? "}" { 240 | Expr::FuncDef(FuncDef { 241 | name: name.to_string(), 242 | arg_names: arg_names.iter().map(|n| n.to_string()).collect(), 243 | block, 244 | }) 245 | } 246 | 247 | rule if_statement() -> Expr 248 | = "if" _? "(" _? cond:expr() _? ")" _* "{" _? block:block() _? "}" { 249 | Expr::If(If { 250 | cond: Box::new(cond), 251 | block, 252 | }) 253 | } 254 | 255 | rule while_loop() -> Expr 256 | = "while" _? "(" _? cond:expr() _? ")" _* "{" _? block:block() _? "}" { 257 | Expr::While(While { 258 | cond: Box::new(cond), 259 | block, 260 | }) 261 | } 262 | 263 | rule expr() -> Expr 264 | = comment() / 265 | expr:(while_loop() / if_statement() / func_decl() / assignment() 266 | / bin_op_expr() / term()) (nbspace()? / newline()) result_comment:result_comment()? { 267 | if result_comment.is_some() { 268 | Expr::ResultComment(next_id(), Box::new(expr)) 269 | } else { 270 | expr 271 | } 272 | } 273 | 274 | rule result_comment() -> () 275 | = "//" _? "#" comment_inner_text()? following_comment()* { () } 276 | 277 | #[cache_left_rec] 278 | rule term() -> Expr 279 | = string_literal_expr() / list_literal() / int() / func_call() / r#ref() / bin_op_expr() 280 | 281 | #[cache_left_rec] 282 | rule bin_op_expr() -> Expr 283 | = left:term() _? op:op() _? right:term() { 284 | Expr::BinOp(BinOp { lhs: Box::new(left), op: op, rhs: Box::new(right) }) 285 | } 286 | 287 | rule op() -> Op 288 | = ("+" { Op::Add } / "/" { Op::Div } / "-" { Op::Sub } / 289 | "*" { Op::Mul } / "==" { Op::Eq } / "!=" { Op::Neq } / ">=" { Op::Gte } / 290 | "<=" { Op::Lte } / ">" { Op::Gt } / "<" { Op::Lt } / "&&" { Op::And } / 291 | "||" { Op::Or }) 292 | 293 | rule func_call() -> Expr 294 | = r#ref:ref_ref() "(" _? args:(expr() ** comma()) _? ")" { 295 | Expr::FunctionCall(FunctionCall { 296 | r#ref, 297 | args, 298 | }) 299 | } 300 | 301 | rule r#ref() -> Expr 302 | = r:ref_ref() { Expr::Ref(r) } 303 | rule ref_ref() -> Ref 304 | = var_ref() / comment_ref() 305 | rule var_ref() -> Ref 306 | = r:ident() { Ref::VarRef(r.into()) } 307 | rule comment_ref() -> Ref 308 | = r:comment_ident() { Ref::CommentRef(r) } 309 | rule comment_ident() -> String 310 | = "#" i:ident() { i.into() } 311 | 312 | rule assignment() -> Expr 313 | = "let" _ r:ref_ref() _ "=" _ expr:expr() { Expr::Assignment(Assignment { 314 | r#ref: r, 315 | expr: Box::new(expr), 316 | })} 317 | 318 | 319 | rule list_literal() -> Expr 320 | = "[" _? exprs:(expr() ** comma()) _? "]" { Expr::ListLiteral(exprs) } 321 | 322 | rule string_literal_expr() -> Expr 323 | = string_lit:string_lit() { Expr::StringLiteral(string_lit) } 324 | 325 | rule int() -> Expr 326 | = num:$("0" / "-"? ['1' ..= '9']+ ['0' ..= '9']*) { Expr::IntLiteral(num.parse().unwrap()) } 327 | 328 | rule comment() -> Expr = named_comment() / anon_comment() 329 | 330 | rule named_comment() -> Expr 331 | = "/" "/" _? name:comment_ident() body:following_comment()? { 332 | Expr::Comment(Comment { name: Some(name), body: body.unwrap_or_else(|| "".into()) }) 333 | } 334 | 335 | rule anon_comment() -> Expr 336 | = body:comment_string() { Expr::Comment(Comment { name: None, body })} 337 | 338 | rule comment_string() -> String 339 | = "/" "/" onespace()? body:comment_inner_text()? following:following_comment()* { 340 | body.map(|b| b.to_owned()).into_iter().chain(following.into_iter()).join("\n") 341 | } 342 | 343 | rule comment_inner_text() -> &'input str 344 | = body:$([^ '\r' | '\n']*) { body } 345 | 346 | rule following_comment() -> String 347 | = newline() c:comment_string() { 348 | if c.starts_with("//") { 349 | let c = c.trim_start_matches("//"); 350 | let c = c.strip_prefix(' ').unwrap_or(c); 351 | format!("\n{}", c) 352 | } else { 353 | c 354 | } 355 | } 356 | 357 | rule ident() -> &'input str = $(ident_start()+ ['a'..='z' | 'A'..='Z' | '_' | '-' | '0'..='9']*) 358 | rule ident_start() -> &'input str = $(['a'..='z' | 'A'..='Z' | '_']+) 359 | 360 | rule string_lit() -> String 361 | = str:$("\"" (!['"'][_] / "\"\"")* "\"") {? 362 | Ok(StringLit::parse(str).or_else(|e| { dbg!(str, e) ; Err("string_lit: " ) })?.value().to_owned()) 363 | } 364 | 365 | rule comma() -> () = _? "," _? 366 | rule nbspace() = onespace()+ 367 | rule onespace() = [' ' | '\t'] 368 | rule newline() = "\n" / "\r\n" 369 | rule whitespace() = (nbspace() / newline())+ 370 | rule _() = quiet!{ whitespace() }; 371 | } 372 | } 373 | -------------------------------------------------------------------------------- /src/reassemble.rs: -------------------------------------------------------------------------------- 1 | use crate::parser::{ 2 | Assignment, BinOp, Block, BlockEl, Comment, Expr, FuncDef, FunctionCall, If, Op, Program, Ref, 3 | While, 4 | }; 5 | use crate::{wrapping, Interpreter}; 6 | use itertools::Itertools; 7 | use std::fmt::Write; 8 | 9 | pub fn output_code(program: &Program, interp: &Interpreter) -> String { 10 | let mut assembled = String::new(); 11 | assemble_expr(&mut assembled, &Expr::Block(program.block.clone()), interp); 12 | assembled 13 | } 14 | 15 | fn assemble_expr(assembled: &mut String, expr: &Expr, interp: &Interpreter) { 16 | match expr { 17 | Expr::Block(block) => { 18 | for block_el in &block.0 { 19 | match block_el { 20 | BlockEl::Expr(expr) => { 21 | assemble_expr(assembled, expr, interp); 22 | } 23 | BlockEl::NewLine => assembled.push_str("\n"), 24 | } 25 | } 26 | } 27 | Expr::Comment(Comment { name, body }) => { 28 | if let Some(name) = name { 29 | assembled.push_str("// #"); 30 | assembled.push_str(name); 31 | 32 | if body.is_empty() { 33 | return; 34 | } 35 | 36 | assembled.push_str("\n"); 37 | } 38 | 39 | if body.is_empty() { 40 | assembled.push_str("//"); 41 | return; 42 | } 43 | 44 | let mut lines = body.split("\n").peekable(); 45 | while let Some(line) = lines.next() { 46 | assembled.push_str("//"); 47 | if !line.is_empty() { 48 | assembled.push_str(" "); 49 | assembled.push_str(line); 50 | } 51 | 52 | if let Some(_) = lines.peek() { 53 | assembled.push_str("\n"); 54 | } 55 | } 56 | } 57 | Expr::Assignment(Assignment { r#ref, expr }) => { 58 | assembled.push_str("let "); 59 | assemble_ref(r#ref, assembled); 60 | assembled.push_str(" = "); 61 | assemble_expr(assembled, expr, interp); 62 | } 63 | Expr::IntLiteral(n) => assembled.push_str(&n.to_string()), 64 | Expr::Ref(r#ref) => assemble_ref(r#ref, assembled), 65 | Expr::FunctionCall(FunctionCall { r#ref, args }) => { 66 | assemble_ref(r#ref, assembled); 67 | assembled.push_str("("); 68 | if let Some((last, init)) = args.split_last() { 69 | for arg in init { 70 | assemble_expr(assembled, arg, interp); 71 | assembled.push_str(", "); 72 | } 73 | assemble_expr(assembled, last, interp); 74 | } 75 | assembled.push_str(")"); 76 | } 77 | e @ (Expr::While(While { cond, block }) | Expr::If(If { cond, block })) => { 78 | assembled.push_str(match e { 79 | Expr::While(_) => "while (", 80 | Expr::If(_) => "if (", 81 | _ => unreachable!(), 82 | }); 83 | assemble_expr(assembled, cond, interp); 84 | assembled.push_str(") {\n"); 85 | assemble_inner_block(assembled, block, interp); 86 | assembled.push_str("\n}"); 87 | } 88 | Expr::FuncDef(FuncDef { 89 | name, 90 | arg_names, 91 | block, 92 | }) => { 93 | assembled.push_str("defn "); 94 | assembled.push_str(name); 95 | assembled.push_str("("); 96 | if let Some((last, init)) = arg_names.split_last() { 97 | for arg_name in init { 98 | assembled.push_str(arg_name); 99 | assembled.push_str(", "); 100 | } 101 | assembled.push_str(last); 102 | } 103 | assembled.push_str(") {\n"); 104 | assemble_inner_block(assembled, block, interp); 105 | assembled.push_str("\n}"); 106 | } 107 | Expr::ListLiteral(list) => { 108 | assembled.push_str("["); 109 | if let Some((last, init)) = list.split_last() { 110 | for item in init { 111 | assemble_expr(assembled, item, interp); 112 | assembled.push_str(", "); 113 | } 114 | assemble_expr(assembled, last, interp); 115 | } 116 | assembled.push_str("]"); 117 | } 118 | Expr::BinOp(BinOp { op, lhs, rhs }) => { 119 | assemble_expr(assembled, lhs, interp); 120 | assembled.push_str(match op { 121 | Op::Add => " + ", 122 | Op::Sub => " - ", 123 | Op::Mul => " * ", 124 | Op::Div => " / ", 125 | Op::Eq => " == ", 126 | Op::Neq => " != ", 127 | Op::Lt => " < ", 128 | Op::Gt => " > ", 129 | Op::Lte => " <= ", 130 | Op::Gte => " >= ", 131 | Op::And => " && ", 132 | Op::Or => " || ", 133 | }); 134 | assemble_expr(assembled, rhs, interp); 135 | } 136 | Expr::StringLiteral(s) => { 137 | write!(assembled, "{:?}", s.as_str()).unwrap(); 138 | } 139 | Expr::ResultComment(id, expr) => { 140 | assemble_expr(assembled, expr, interp); 141 | assembled.push_str(" // #"); 142 | let result_comments = interp.result_comments.borrow(); 143 | if let Some(value) = result_comments.get(id) { 144 | let comment = wrapping::stringify(value); 145 | let lines = comment.lines().collect_vec(); 146 | if let Some((first, rest)) = lines.split_first() { 147 | assembled.push_str(first); 148 | if !rest.is_empty() { 149 | for line in rest { 150 | assembled.push_str("\n"); 151 | assembled.push_str("// "); 152 | assembled.push_str(line); 153 | } 154 | } 155 | } 156 | } 157 | } 158 | } 159 | } 160 | 161 | fn assemble_inner_block(assembled: &mut String, block: &Block, interp: &Interpreter) { 162 | let mut inner = String::new(); 163 | assemble_expr(&mut inner, &Expr::Block(block.clone()), interp); 164 | let inner = inner 165 | .lines() 166 | .map(|line| { 167 | if line.trim().is_empty() { 168 | line.to_string() 169 | } else { 170 | // indentation 171 | format!(" {}", line) 172 | } 173 | }) 174 | .join("\n"); 175 | assembled.push_str(&inner); 176 | } 177 | 178 | fn assemble_ref(r#ref: &Ref, assembled: &mut String) { 179 | match r#ref { 180 | Ref::CommentRef(s) => { 181 | assembled.push_str("#"); 182 | assembled.push_str(s); 183 | } 184 | Ref::VarRef(s) => assembled.push_str(s), 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /src/wrapping.rs: -------------------------------------------------------------------------------- 1 | use crate::interp::Value; 2 | use hyphenation::{Language, Load, Standard}; 3 | use itertools::Itertools; 4 | use lazy_static::lazy_static; 5 | use pretty::{Doc, RcDoc}; 6 | use textwrap::{indent, refill, Options, WordSplitter}; 7 | 8 | lazy_static! { 9 | static ref WORD_SPLITTER: WordSplitter = { 10 | let dictionary = Standard::from_embedded(Language::EnglishUS).unwrap(); 11 | WordSplitter::Hyphenation(dictionary) 12 | }; 13 | } 14 | 15 | pub(crate) fn rewrap(s: &str) -> String { 16 | let mut new_comment_string = String::new(); 17 | 18 | let comment_root = parse_comment(s); 19 | 20 | for (i, node) in comment_root.children.iter().enumerate() { 21 | match node { 22 | CommentNode::Paragraph(p) => { 23 | let refilled = refill_paragraph(&p.iter().join("\n"), COMMENT_COLUMN_WIDTH); 24 | if i > 0 { 25 | new_comment_string.push_str(&format!("\n\n{}", refilled)); 26 | } else { 27 | new_comment_string.push_str(&format!("{}", refilled)); 28 | } 29 | } 30 | CommentNode::Header(header) => { 31 | if i > 0 { 32 | let prev = comment_root.children.get(i - 1); 33 | if matches!(prev, Some(CommentNode::Paragraph(_))) { 34 | new_comment_string.push_str("\n"); 35 | } 36 | new_comment_string.push_str(&format!("\n{}:", header)); 37 | } else { 38 | new_comment_string.push_str(&format!("{}:", header)); 39 | } 40 | } 41 | CommentNode::List(items) => { 42 | let prev = comment_root.children.get(i - 1); 43 | if matches!(prev, Some(CommentNode::Header(_))) { 44 | new_comment_string.push_str("\n"); 45 | } 46 | 47 | let items_one_line = items.iter().join(" "); 48 | let s = refill_paragraph(&items_one_line, COMMENT_COLUMN_WIDTH - (INDENT_SIZE + 1)); 49 | new_comment_string.push_str(&indent(&s, &INDENT_SPACES)); 50 | } 51 | CommentNode::Pre(text) => { 52 | if i > 0 { 53 | new_comment_string.push_str("\n"); 54 | } 55 | new_comment_string.push_str(&format!("` {}", text)); 56 | } 57 | } 58 | } 59 | new_comment_string 60 | } 61 | 62 | fn refill_paragraph(s: &str, width: usize) -> String { 63 | let options = Options::new(width).word_splitter(WORD_SPLITTER.clone()); 64 | refill(s, options) 65 | } 66 | 67 | fn to_doc(val: &Value) -> RcDoc<()> { 68 | match val { 69 | Value::String(s) => RcDoc::as_string(s), 70 | Value::Map(m) => RcDoc::text("{") 71 | .append( 72 | RcDoc::intersperse( 73 | m.iter().map(|(k, v)| { 74 | RcDoc::intersperse( 75 | [to_doc(k), RcDoc::text("=>"), to_doc(v)].into_iter(), 76 | ":", 77 | ) 78 | .group() 79 | }), 80 | Doc::line(), 81 | ) 82 | .nest(1) 83 | .group(), 84 | ) 85 | .append(RcDoc::text("}")), 86 | Value::Int(n) => RcDoc::as_string(n), 87 | Value::Function(_) => RcDoc::as_string(""), 88 | Value::Bool(b) => RcDoc::as_string(b), 89 | Value::List(vals) => RcDoc::text("[") 90 | .append( 91 | RcDoc::intersperse( 92 | vals.iter().map(to_doc), 93 | RcDoc::text(",").append(Doc::line()), 94 | ) 95 | .nest(1) 96 | .group(), 97 | ) 98 | .append(RcDoc::text("]")), 99 | } 100 | } 101 | 102 | const COLUMN_WIDTH: usize = 75; 103 | // 3 because `//` is 2 chars and ` ` is 1 104 | const COMMENT_COLUMN_WIDTH: usize = COLUMN_WIDTH - 3; 105 | 106 | pub fn stringify(val: &Value) -> String { 107 | let mut w = Vec::new(); 108 | to_doc(val).render(COMMENT_COLUMN_WIDTH, &mut w).unwrap(); 109 | String::from_utf8(w).unwrap() 110 | } 111 | 112 | #[derive(Debug, Clone)] 113 | struct CommentRoot { 114 | children: Vec, 115 | } 116 | 117 | #[derive(Debug, Clone)] 118 | enum CommentNode { 119 | Paragraph(Vec), 120 | Header(String), 121 | List(Vec), 122 | Pre(String), 123 | } 124 | 125 | const INDENT_SIZE: usize = 2; 126 | 127 | lazy_static! { 128 | static ref INDENT_SPACES: String = " ".repeat(INDENT_SIZE); 129 | } 130 | 131 | struct CommentParser { 132 | root: CommentRoot, 133 | list_acc: Vec, 134 | paragraph_acc: Vec, 135 | } 136 | 137 | impl CommentParser { 138 | fn new() -> Self { 139 | Self { 140 | list_acc: vec![], 141 | paragraph_acc: vec![], 142 | root: CommentRoot { children: vec![] }, 143 | } 144 | } 145 | 146 | fn push_node(&mut self, node: CommentNode) { 147 | if !matches!(node, CommentNode::Paragraph(_)) { 148 | self.flush_paragraph(); 149 | } 150 | if !matches!(node, CommentNode::List(_)) { 151 | self.flush_list(); 152 | } 153 | 154 | match node { 155 | CommentNode::Paragraph(p) => self.paragraph_acc.extend(p), 156 | CommentNode::Header(h) => self.root.children.push(CommentNode::Header(h)), 157 | CommentNode::List(l) => self.list_acc.extend(l), 158 | CommentNode::Pre(p) => self.root.children.push(CommentNode::Pre(p)), 159 | } 160 | } 161 | 162 | fn flush_all(&mut self) { 163 | self.flush_paragraph(); 164 | self.flush_list(); 165 | } 166 | 167 | fn flush_paragraph(&mut self) { 168 | if !self.paragraph_acc.is_empty() { 169 | let mut clear_paragraph_acc = vec![]; 170 | std::mem::swap(&mut clear_paragraph_acc, &mut self.paragraph_acc); 171 | self.root 172 | .children 173 | .push(CommentNode::Paragraph(clear_paragraph_acc)); 174 | } 175 | } 176 | 177 | fn flush_list(&mut self) { 178 | if !self.list_acc.is_empty() { 179 | let mut clear_list_acc = vec![]; 180 | std::mem::swap(&mut clear_list_acc, &mut self.list_acc); 181 | self.root.children.push(CommentNode::List(clear_list_acc)); 182 | } 183 | } 184 | 185 | fn parse(mut self, s: &str) -> CommentRoot { 186 | for line in s.lines() { 187 | if line.starts_with("` ") { 188 | self.push_node(CommentNode::Pre(line[2..].to_string())); 189 | } else if line.starts_with(INDENT_SPACES.as_str()) { 190 | self.push_node(CommentNode::List( 191 | line.split_whitespace().map(|s| s.to_string()).collect(), 192 | )); 193 | } else if line.ends_with(':') { 194 | self.push_node(CommentNode::Header(line[..line.len() - 1].to_string())); 195 | } else if line == "" { 196 | self.flush_all(); 197 | } else { 198 | self.push_node(CommentNode::Paragraph(vec![line.to_string()])); 199 | } 200 | } 201 | self.flush_all(); 202 | self.root 203 | } 204 | } 205 | 206 | fn parse_comment(s: &str) -> CommentRoot { 207 | CommentParser::new().parse(s) 208 | } 209 | -------------------------------------------------------------------------------- /syntax_highlighting/zac.vim: -------------------------------------------------------------------------------- 1 | " Vim syntax file 2 | " Language: Zac 3 | 4 | " Usage Instructions 5 | " Put this file in .vim/syntax/zac.vim 6 | " and add in your .vimrc file the next line: 7 | " autocmd BufRead,BufNewFile *.zac set filetype=zac 8 | 9 | if exists("b:current_syntax") 10 | finish 11 | endif 12 | 13 | syntax keyword zacTodos TODO XXX FIXME NOTE 14 | 15 | 16 | 17 | " Language keywords 18 | syntax keyword zacKeywords let defn 19 | syntax keyword zacLoopKeywords while if 20 | 21 | " Comments 22 | syntax region zacCommentLine start="//" end="$" contains=zacTodos,zacCommentIdent 23 | syntax region zacDirective start="%" end=" " 24 | 25 | syntax match zacCommentIdent "#[a-z_-][a-z0-9_-]*\>" 26 | syntax match zacIdent "\<[a-z_][a-z0-9_]*\>" 27 | 28 | " Numbers 29 | syntax match zacDecInt display "\<[0-9][0-9_]*" 30 | syntax match zacHexInt display "\<0[xX][0-9a-fA-F][0-9_a-fA-F]*" 31 | syntax match zacFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)" 32 | 33 | " Functions 34 | syntax match zacFunction display "\<[a-z_][a-z0-9_]*\>("he=e-1 35 | 36 | " TODO: we don't have string literalls... yet? or at all? 37 | " Strings 38 | " syntax region zacString start=/\v"/ skip=/\v\\./ end=/\v"/ 39 | " syntax region zacString start=/\v'/ skip=/\v\\./ end=/\v'/ 40 | 41 | " Set highlights 42 | highlight default link zacTodos Todo 43 | highlight default link zacKeywords Keyword 44 | " comments are highlighted as strings in this lang 45 | " TODO: only some strings treated as values highlighted this way 46 | " highlight default link zacCommentLine Comment 47 | highlight default link zacLoopKeywords Repeat 48 | highlight default link zacDecInt Number 49 | highlight default link zacHexInt Number 50 | highlight default link zacFloat Float 51 | highlight default link zacCommentLine Comment 52 | highlight default link zacIdent Identifier 53 | highlight default link zacCommentIdent Special 54 | highlight default link zacFunction Function 55 | 56 | let b:current_syntax = "zac" 57 | -------------------------------------------------------------------------------- /wondering: -------------------------------------------------------------------------------- 1 | ## Zac Programming Language 2 | An interactive scripting language where you can read and modify code comments as if they were regular strings. Add and view text-based visualizations and debugging information inside your source code file. 3 | 4 | ### [Try it in your browser right away](https://sumeet.github.io/Zac/) 5 | The experience is better locally though, read on! 6 | 7 | ![GoL](.README_assets/GoL.gif) 8 | 9 | Since this is an interactive editor, the best examples are moving use cases. 10 | 11 | #### Built-in Help 12 | ![help](.README_assets/help.gif) 13 | 14 | #### Workbook style examples that don't go out of sync 15 | ![fib](.README_assets/fib.gif) 16 | 17 | ### Cargo Install Instructions 18 | Make sure you have the [Cargo package manager](https://crates.io/) with a recent nightly Rust, and from inside this 19 | directory: 20 | ```console 21 | cargo install --path . 22 | ``` 23 | 24 | ### How To Run 25 | As an example, open [examples/hello.zac](examples/hello.zac) in your editor. Then, run (preferably through your editor) 26 | 27 | ```console 28 | zac examples/hello.zac 29 | ``` 30 | 31 | (or if you're a Rust coder) 32 | 33 | ```console 34 | cargo build --release 35 | target/release/zac examples/hello.zac 36 | ``` 37 | 38 | ![hello](.README_assets/hello.gif) 39 | 40 | ### More Examples 41 | - [GoL.zac](examples/GoL.zac) 42 | - [fib.zac](examples/fib.zac) 43 | - [help.zac](examples/help.zac) 44 | - [the in-browser version](https://sumeet.github.io/Zac/) 45 | 46 | ### Zac Language Overview 47 | 48 | You'll have a better time getting a feel of how the language works from looking at and running examples than from reading detailed documentation. Other than the comment modification, Zac is a familiar-looking scripting language. 49 | 50 | Comments come in two flavors, anonymous and named. 51 | 52 | ```js 53 | // This is an anonymous comment because it doesn't have a #identifier as 54 | // the first line. 55 | // 56 | // This cannot be referenced or modified from within the code. 57 | ``` 58 | 59 | ```js 60 | let #changeme = // some string 61 | 62 | // #changeme 63 | // This is a comment with the name #changeme. 64 | 65 | let another_string = // another string 66 | let #changeme = cat(#changeme, another_string) 67 | 68 | // Named comments can be changed before and/or after they appear in the source code. It's an error 69 | // when ther 70 | // 71 | // however, 72 | ``` 73 | 74 | As of now, there is no specific syntax for string literals, if you need a string literal, you can make a comment. 75 | 76 | 77 | #### It's Better With Syntax Highlighting 78 | If you're using Vim, there's a [syntax file](syntax_highlighting/) in the repo. Put this in your `~/.vim/syntax` directory, or `~/.config/nvim/syntax` if you're using Neovim, and follow the instructions at the top of the file. 79 | 80 | #### Interactive Editing 81 | It's highly recommended that you save the file from inside of your editor instead of changing windows. Zac is meant to be used like Gofmt or Rustfmt, run every time you save your file. 82 | 83 | In Vim, you can use the following command to save your file: 84 | ```vim 85 | :map \t :w\|:!zac %:e 86 | ``` 87 | ### Status 88 | This is a proof-of-concept I made in the first [Lang Jam](langjam/langjam), a 2-day competition to design a programming language around the theme `first-class comments`. 89 | 90 | Submitted to the contest under the team name SOLDIER. 91 | 92 | 93 | --------------------------------------------------------------------------------