Working wasm game of life example
This commit is contained in:
		
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
/target
 | 
			
		||||
**/*.rs.bk
 | 
			
		||||
Cargo.lock
 | 
			
		||||
bin/
 | 
			
		||||
pkg/
 | 
			
		||||
wasm-pack.log
 | 
			
		||||
							
								
								
									
										27
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "wasm-game-of-life"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
authors = ["fabian"]
 | 
			
		||||
edition = "2018"
 | 
			
		||||
 | 
			
		||||
[lib]
 | 
			
		||||
crate-type = ["cdylib", "rlib"]
 | 
			
		||||
 | 
			
		||||
[features]
 | 
			
		||||
default = ["console_error_panic_hook"]
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
wasm-bindgen = "0.2.100"
 | 
			
		||||
 | 
			
		||||
# The `console_error_panic_hook` crate provides better debugging of panics by
 | 
			
		||||
# logging them with `console.error`. This is great for development, but requires
 | 
			
		||||
# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for
 | 
			
		||||
# code size when deploying.
 | 
			
		||||
console_error_panic_hook = { version = "0.1.7", optional = true }
 | 
			
		||||
 | 
			
		||||
[dev-dependencies]
 | 
			
		||||
wasm-bindgen-test = "0.3.50"
 | 
			
		||||
 | 
			
		||||
[profile.release]
 | 
			
		||||
# Tell `rustc` to optimize for small code size.
 | 
			
		||||
opt-level = "s"
 | 
			
		||||
							
								
								
									
										201
									
								
								LICENSE_APACHE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								LICENSE_APACHE
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,201 @@
 | 
			
		||||
                              Apache License
 | 
			
		||||
                        Version 2.0, January 2004
 | 
			
		||||
                     http://www.apache.org/licenses/
 | 
			
		||||
 | 
			
		||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
			
		||||
 | 
			
		||||
1. Definitions.
 | 
			
		||||
 | 
			
		||||
   "License" shall mean the terms and conditions for use, reproduction,
 | 
			
		||||
   and distribution as defined by Sections 1 through 9 of this document.
 | 
			
		||||
 | 
			
		||||
   "Licensor" shall mean the copyright owner or entity authorized by
 | 
			
		||||
   the copyright owner that is granting the License.
 | 
			
		||||
 | 
			
		||||
   "Legal Entity" shall mean the union of the acting entity and all
 | 
			
		||||
   other entities that control, are controlled by, or are under common
 | 
			
		||||
   control with that entity. For the purposes of this definition,
 | 
			
		||||
   "control" means (i) the power, direct or indirect, to cause the
 | 
			
		||||
   direction or management of such entity, whether by contract or
 | 
			
		||||
   otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
			
		||||
   outstanding shares, or (iii) beneficial ownership of such entity.
 | 
			
		||||
 | 
			
		||||
   "You" (or "Your") shall mean an individual or Legal Entity
 | 
			
		||||
   exercising permissions granted by this License.
 | 
			
		||||
 | 
			
		||||
   "Source" form shall mean the preferred form for making modifications,
 | 
			
		||||
   including but not limited to software source code, documentation
 | 
			
		||||
   source, and configuration files.
 | 
			
		||||
 | 
			
		||||
   "Object" form shall mean any form resulting from mechanical
 | 
			
		||||
   transformation or translation of a Source form, including but
 | 
			
		||||
   not limited to compiled object code, generated documentation,
 | 
			
		||||
   and conversions to other media types.
 | 
			
		||||
 | 
			
		||||
   "Work" shall mean the work of authorship, whether in Source or
 | 
			
		||||
   Object form, made available under the License, as indicated by a
 | 
			
		||||
   copyright notice that is included in or attached to the work
 | 
			
		||||
   (an example is provided in the Appendix below).
 | 
			
		||||
 | 
			
		||||
   "Derivative Works" shall mean any work, whether in Source or Object
 | 
			
		||||
   form, that is based on (or derived from) the Work and for which the
 | 
			
		||||
   editorial revisions, annotations, elaborations, or other modifications
 | 
			
		||||
   represent, as a whole, an original work of authorship. For the purposes
 | 
			
		||||
   of this License, Derivative Works shall not include works that remain
 | 
			
		||||
   separable from, or merely link (or bind by name) to the interfaces of,
 | 
			
		||||
   the Work and Derivative Works thereof.
 | 
			
		||||
 | 
			
		||||
   "Contribution" shall mean any work of authorship, including
 | 
			
		||||
   the original version of the Work and any modifications or additions
 | 
			
		||||
   to that Work or Derivative Works thereof, that is intentionally
 | 
			
		||||
   submitted to Licensor for inclusion in the Work by the copyright owner
 | 
			
		||||
   or by an individual or Legal Entity authorized to submit on behalf of
 | 
			
		||||
   the copyright owner. For the purposes of this definition, "submitted"
 | 
			
		||||
   means any form of electronic, verbal, or written communication sent
 | 
			
		||||
   to the Licensor or its representatives, including but not limited to
 | 
			
		||||
   communication on electronic mailing lists, source code control systems,
 | 
			
		||||
   and issue tracking systems that are managed by, or on behalf of, the
 | 
			
		||||
   Licensor for the purpose of discussing and improving the Work, but
 | 
			
		||||
   excluding communication that is conspicuously marked or otherwise
 | 
			
		||||
   designated in writing by the copyright owner as "Not a Contribution."
 | 
			
		||||
 | 
			
		||||
   "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
			
		||||
   on behalf of whom a Contribution has been received by Licensor and
 | 
			
		||||
   subsequently incorporated within the Work.
 | 
			
		||||
 | 
			
		||||
2. Grant of Copyright License. Subject to the terms and conditions of
 | 
			
		||||
   this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
   copyright license to reproduce, prepare Derivative Works of,
 | 
			
		||||
   publicly display, publicly perform, sublicense, and distribute the
 | 
			
		||||
   Work and such Derivative Works in Source or Object form.
 | 
			
		||||
 | 
			
		||||
3. Grant of Patent License. Subject to the terms and conditions of
 | 
			
		||||
   this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
   (except as stated in this section) patent license to make, have made,
 | 
			
		||||
   use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
			
		||||
   where such license applies only to those patent claims licensable
 | 
			
		||||
   by such Contributor that are necessarily infringed by their
 | 
			
		||||
   Contribution(s) alone or by combination of their Contribution(s)
 | 
			
		||||
   with the Work to which such Contribution(s) was submitted. If You
 | 
			
		||||
   institute patent litigation against any entity (including a
 | 
			
		||||
   cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
			
		||||
   or a Contribution incorporated within the Work constitutes direct
 | 
			
		||||
   or contributory patent infringement, then any patent licenses
 | 
			
		||||
   granted to You under this License for that Work shall terminate
 | 
			
		||||
   as of the date such litigation is filed.
 | 
			
		||||
 | 
			
		||||
4. Redistribution. You may reproduce and distribute copies of the
 | 
			
		||||
   Work or Derivative Works thereof in any medium, with or without
 | 
			
		||||
   modifications, and in Source or Object form, provided that You
 | 
			
		||||
   meet the following conditions:
 | 
			
		||||
 | 
			
		||||
   (a) You must give any other recipients of the Work or
 | 
			
		||||
       Derivative Works a copy of this License; and
 | 
			
		||||
 | 
			
		||||
   (b) You must cause any modified files to carry prominent notices
 | 
			
		||||
       stating that You changed the files; and
 | 
			
		||||
 | 
			
		||||
   (c) You must retain, in the Source form of any Derivative Works
 | 
			
		||||
       that You distribute, all copyright, patent, trademark, and
 | 
			
		||||
       attribution notices from the Source form of the Work,
 | 
			
		||||
       excluding those notices that do not pertain to any part of
 | 
			
		||||
       the Derivative Works; and
 | 
			
		||||
 | 
			
		||||
   (d) If the Work includes a "NOTICE" text file as part of its
 | 
			
		||||
       distribution, then any Derivative Works that You distribute must
 | 
			
		||||
       include a readable copy of the attribution notices contained
 | 
			
		||||
       within such NOTICE file, excluding those notices that do not
 | 
			
		||||
       pertain to any part of the Derivative Works, in at least one
 | 
			
		||||
       of the following places: within a NOTICE text file distributed
 | 
			
		||||
       as part of the Derivative Works; within the Source form or
 | 
			
		||||
       documentation, if provided along with the Derivative Works; or,
 | 
			
		||||
       within a display generated by the Derivative Works, if and
 | 
			
		||||
       wherever such third-party notices normally appear. The contents
 | 
			
		||||
       of the NOTICE file are for informational purposes only and
 | 
			
		||||
       do not modify the License. You may add Your own attribution
 | 
			
		||||
       notices within Derivative Works that You distribute, alongside
 | 
			
		||||
       or as an addendum to the NOTICE text from the Work, provided
 | 
			
		||||
       that such additional attribution notices cannot be construed
 | 
			
		||||
       as modifying the License.
 | 
			
		||||
 | 
			
		||||
   You may add Your own copyright statement to Your modifications and
 | 
			
		||||
   may provide additional or different license terms and conditions
 | 
			
		||||
   for use, reproduction, or distribution of Your modifications, or
 | 
			
		||||
   for any such Derivative Works as a whole, provided Your use,
 | 
			
		||||
   reproduction, and distribution of the Work otherwise complies with
 | 
			
		||||
   the conditions stated in this License.
 | 
			
		||||
 | 
			
		||||
5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
			
		||||
   any Contribution intentionally submitted for inclusion in the Work
 | 
			
		||||
   by You to the Licensor shall be under the terms and conditions of
 | 
			
		||||
   this License, without any additional terms or conditions.
 | 
			
		||||
   Notwithstanding the above, nothing herein shall supersede or modify
 | 
			
		||||
   the terms of any separate license agreement you may have executed
 | 
			
		||||
   with Licensor regarding such Contributions.
 | 
			
		||||
 | 
			
		||||
6. Trademarks. This License does not grant permission to use the trade
 | 
			
		||||
   names, trademarks, service marks, or product names of the Licensor,
 | 
			
		||||
   except as required for reasonable and customary use in describing the
 | 
			
		||||
   origin of the Work and reproducing the content of the NOTICE file.
 | 
			
		||||
 | 
			
		||||
7. Disclaimer of Warranty. Unless required by applicable law or
 | 
			
		||||
   agreed to in writing, Licensor provides the Work (and each
 | 
			
		||||
   Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
			
		||||
   implied, including, without limitation, any warranties or conditions
 | 
			
		||||
   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
			
		||||
   PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
			
		||||
   appropriateness of using or redistributing the Work and assume any
 | 
			
		||||
   risks associated with Your exercise of permissions under this License.
 | 
			
		||||
 | 
			
		||||
8. Limitation of Liability. In no event and under no legal theory,
 | 
			
		||||
   whether in tort (including negligence), contract, or otherwise,
 | 
			
		||||
   unless required by applicable law (such as deliberate and grossly
 | 
			
		||||
   negligent acts) or agreed to in writing, shall any Contributor be
 | 
			
		||||
   liable to You for damages, including any direct, indirect, special,
 | 
			
		||||
   incidental, or consequential damages of any character arising as a
 | 
			
		||||
   result of this License or out of the use or inability to use the
 | 
			
		||||
   Work (including but not limited to damages for loss of goodwill,
 | 
			
		||||
   work stoppage, computer failure or malfunction, or any and all
 | 
			
		||||
   other commercial damages or losses), even if such Contributor
 | 
			
		||||
   has been advised of the possibility of such damages.
 | 
			
		||||
 | 
			
		||||
9. Accepting Warranty or Additional Liability. While redistributing
 | 
			
		||||
   the Work or Derivative Works thereof, You may choose to offer,
 | 
			
		||||
   and charge a fee for, acceptance of support, warranty, indemnity,
 | 
			
		||||
   or other liability obligations and/or rights consistent with this
 | 
			
		||||
   License. However, in accepting such obligations, You may act only
 | 
			
		||||
   on Your own behalf and on Your sole responsibility, not on behalf
 | 
			
		||||
   of any other Contributor, and only if You agree to indemnify,
 | 
			
		||||
   defend, and hold each Contributor harmless for any liability
 | 
			
		||||
   incurred by, or claims asserted against, such Contributor by reason
 | 
			
		||||
   of your accepting any such warranty or additional liability.
 | 
			
		||||
 | 
			
		||||
END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
APPENDIX: How to apply the Apache License to your work.
 | 
			
		||||
 | 
			
		||||
   To apply the Apache License to your work, attach the following
 | 
			
		||||
   boilerplate notice, with the fields enclosed by brackets "[]"
 | 
			
		||||
   replaced with your own identifying information. (Don't include
 | 
			
		||||
   the brackets!)  The text should be enclosed in the appropriate
 | 
			
		||||
   comment syntax for the file format. We also recommend that a
 | 
			
		||||
   file or class name and description of purpose be included on the
 | 
			
		||||
   same "printed page" as the copyright notice for easier
 | 
			
		||||
   identification within third-party archives.
 | 
			
		||||
 | 
			
		||||
Copyright [yyyy] [name of copyright owner]
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
							
								
								
									
										25
									
								
								LICENSE_MIT
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								LICENSE_MIT
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
Copyright (c) 2018 fabian
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any
 | 
			
		||||
person obtaining a copy of this software and associated
 | 
			
		||||
documentation files (the "Software"), to deal in the
 | 
			
		||||
Software without restriction, including without
 | 
			
		||||
limitation the rights to use, copy, modify, merge,
 | 
			
		||||
publish, distribute, sublicense, and/or sell copies of
 | 
			
		||||
the Software, and to permit persons to whom the Software
 | 
			
		||||
is furnished to do so, subject to the following
 | 
			
		||||
conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice
 | 
			
		||||
shall be included in all copies or substantial portions
 | 
			
		||||
of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
 | 
			
		||||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 | 
			
		||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 | 
			
		||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
 | 
			
		||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 | 
			
		||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | 
			
		||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 | 
			
		||||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
DEALINGS IN THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										84
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
<div align="center">
 | 
			
		||||
 | 
			
		||||
  <h1><code>wasm-pack-template</code></h1>
 | 
			
		||||
 | 
			
		||||
  <strong>A template for kick starting a Rust and WebAssembly project using <a href="https://github.com/rustwasm/wasm-pack">wasm-pack</a>.</strong>
 | 
			
		||||
 | 
			
		||||
  <p>
 | 
			
		||||
    <a href="https://travis-ci.org/rustwasm/wasm-pack-template"><img src="https://img.shields.io/travis/rustwasm/wasm-pack-template.svg?style=flat-square" alt="Build Status" /></a>
 | 
			
		||||
  </p>
 | 
			
		||||
 | 
			
		||||
  <h3>
 | 
			
		||||
    <a href="https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html">Tutorial</a>
 | 
			
		||||
    <span> | </span>
 | 
			
		||||
    <a href="https://discordapp.com/channels/442252698964721669/443151097398296587">Chat</a>
 | 
			
		||||
  </h3>
 | 
			
		||||
 | 
			
		||||
  <sub>Built with 🦀🕸 by <a href="https://rustwasm.github.io/">The Rust and WebAssembly Working Group</a></sub>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
## About
 | 
			
		||||
 | 
			
		||||
[**📚 Read this template tutorial! 📚**][template-docs]
 | 
			
		||||
 | 
			
		||||
This template is designed for compiling Rust libraries into WebAssembly and
 | 
			
		||||
publishing the resulting package to NPM.
 | 
			
		||||
 | 
			
		||||
Be sure to check out [other `wasm-pack` tutorials online][tutorials] for other
 | 
			
		||||
templates and usages of `wasm-pack`.
 | 
			
		||||
 | 
			
		||||
[tutorials]: https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html
 | 
			
		||||
[template-docs]: https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html
 | 
			
		||||
 | 
			
		||||
## 🚴 Usage
 | 
			
		||||
 | 
			
		||||
### 🐑 Use `cargo generate` to Clone this Template
 | 
			
		||||
 | 
			
		||||
[Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate)
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project
 | 
			
		||||
cd my-project
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 🛠️ Build with `wasm-pack build`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
wasm-pack build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 🔬 Test in Headless Browsers with `wasm-pack test`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
wasm-pack test --headless --firefox
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 🎁 Publish to NPM with `wasm-pack publish`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
wasm-pack publish
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## 🔋 Batteries Included
 | 
			
		||||
 | 
			
		||||
* [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating
 | 
			
		||||
  between WebAssembly and JavaScript.
 | 
			
		||||
* [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook)
 | 
			
		||||
  for logging panic messages to the developer console.
 | 
			
		||||
* `LICENSE-APACHE` and `LICENSE-MIT`: most Rust projects are licensed this way, so these are included for you
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
Licensed under either of
 | 
			
		||||
 | 
			
		||||
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
 | 
			
		||||
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
 | 
			
		||||
 | 
			
		||||
at your option.
 | 
			
		||||
 | 
			
		||||
### Contribution
 | 
			
		||||
 | 
			
		||||
Unless you explicitly state otherwise, any contribution intentionally
 | 
			
		||||
submitted for inclusion in the work by you, as defined in the Apache-2.0
 | 
			
		||||
license, shall be dual licensed as above, without any additional terms or
 | 
			
		||||
conditions.
 | 
			
		||||
							
								
								
									
										5
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
build:
 | 
			
		||||
	wasm-pack build && cd www && pnpm i
 | 
			
		||||
 | 
			
		||||
run:
 | 
			
		||||
	cd www && pnpm run start
 | 
			
		||||
							
								
								
									
										134
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
			
		||||
mod utils;
 | 
			
		||||
 | 
			
		||||
use std::fmt;
 | 
			
		||||
 | 
			
		||||
use wasm_bindgen::prelude::*;
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
extern "C" {
 | 
			
		||||
    fn alert(s: &str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn greet(s: &str) {
 | 
			
		||||
    alert(&format!("Hello, {}!", s));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
#[repr(u8)]
 | 
			
		||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
 | 
			
		||||
pub enum Cell {
 | 
			
		||||
    Dead = 0,
 | 
			
		||||
    Alive = 1,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub struct Universe {
 | 
			
		||||
    width: u32,
 | 
			
		||||
    height: u32,
 | 
			
		||||
    cells: Vec<Cell>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Universe {
 | 
			
		||||
    fn get_index(&self, row: u32, column: u32) -> usize {
 | 
			
		||||
        (row * self.width + column) as usize
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn live_neighbor_count(&self, row: u32, column: u32) -> u8 {
 | 
			
		||||
        let mut count = 0;
 | 
			
		||||
        for delta_row in [self.height - 1, 0, 1].iter().cloned() {
 | 
			
		||||
            for delta_col in [self.width - 1, 0, 1].iter().cloned() {
 | 
			
		||||
                if delta_row == 0 && delta_col == 0 {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                let neighbor_row = (row + delta_row) % self.height;
 | 
			
		||||
                let neighbor_col = (column + delta_col) % self.width;
 | 
			
		||||
                let idx = self.get_index(neighbor_row, neighbor_col);
 | 
			
		||||
                count += self.cells[idx] as u8;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        count
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
impl Universe {
 | 
			
		||||
    pub fn tick(&mut self) {
 | 
			
		||||
        let mut next = self.cells.clone();
 | 
			
		||||
 | 
			
		||||
        for row in 0..self.height {
 | 
			
		||||
            for col in 0..self.width {
 | 
			
		||||
                let idx = self.get_index(row, col);
 | 
			
		||||
                let cell = self.cells[idx];
 | 
			
		||||
                let live_neighbors = self.live_neighbor_count(row, col);
 | 
			
		||||
 | 
			
		||||
                let next_cell = match (cell, live_neighbors) {
 | 
			
		||||
                    // Rule 1: Any live cell with fewer than two live neighbours
 | 
			
		||||
                    // dies, as if caused by underpopulation.
 | 
			
		||||
                    (Cell::Alive, x) if x < 2 => Cell::Dead,
 | 
			
		||||
                    // Rule 2: Any live cell with two or three live neighbours
 | 
			
		||||
                    // lives on to the next generation.
 | 
			
		||||
                    (Cell::Alive, 2) | (Cell::Alive, 3) => Cell::Alive,
 | 
			
		||||
                    // Rule 3: Any live cell with more than three live
 | 
			
		||||
                    // neighbours dies, as if by overpopulation.
 | 
			
		||||
                    (Cell::Alive, x) if x > 3 => Cell::Dead,
 | 
			
		||||
                    // Rule 4: Any dead cell with exactly three live neighbours
 | 
			
		||||
                    // becomes a live cell, as if by reproduction.
 | 
			
		||||
                    (Cell::Dead, 3) => Cell::Alive,
 | 
			
		||||
                    // All other cells remain in the same state.
 | 
			
		||||
                    (otherwise, _) => otherwise,
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                next[idx] = next_cell;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        self.cells = next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn new() -> Universe {
 | 
			
		||||
        let width = 64;
 | 
			
		||||
        let height = 64;
 | 
			
		||||
 | 
			
		||||
        let cells = (0..width * height)
 | 
			
		||||
            .map(|i| {
 | 
			
		||||
                if i % 2 == 0 || i % 7 == 0 {
 | 
			
		||||
                    Cell::Alive
 | 
			
		||||
                } else {
 | 
			
		||||
                    Cell::Dead
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            .collect();
 | 
			
		||||
 | 
			
		||||
        Universe {
 | 
			
		||||
            width,
 | 
			
		||||
            height,
 | 
			
		||||
            cells,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn render(&self) -> String {
 | 
			
		||||
        self.to_string()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Universe {
 | 
			
		||||
    fn default() -> Self {
 | 
			
		||||
        Self::new()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl fmt::Display for Universe {
 | 
			
		||||
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 | 
			
		||||
        for line in self.cells.as_slice().chunks(self.width as usize) {
 | 
			
		||||
            for &cell in line {
 | 
			
		||||
                let symbol = if cell == Cell::Dead { '◻' } else { '◼' };
 | 
			
		||||
                write!(f, "{}", symbol)?;
 | 
			
		||||
            }
 | 
			
		||||
            writeln!(f)?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								src/utils.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/utils.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
pub fn set_panic_hook() {
 | 
			
		||||
    // When the `console_error_panic_hook` feature is enabled, we can call the
 | 
			
		||||
    // `set_panic_hook` function at least once during initialization, and then
 | 
			
		||||
    // we will get better error messages if our code ever panics.
 | 
			
		||||
    //
 | 
			
		||||
    // For more details see
 | 
			
		||||
    // https://github.com/rustwasm/console_error_panic_hook#readme
 | 
			
		||||
    #[cfg(feature = "console_error_panic_hook")]
 | 
			
		||||
    console_error_panic_hook::set_once();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								www
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								www
									
									
									
									
									
										Submodule
									
								
							 Submodule www added at 8d3f892b72
									
								
							
		Reference in New Issue
	
	Block a user