Skip to content

Instantly share code, notes, and snippets.

@davidgrenier
Created May 4, 2023 19:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidgrenier/2fd7e735510889c86863bc098f1ea194 to your computer and use it in GitHub Desktop.
Save davidgrenier/2fd7e735510889c86863bc098f1ea194 to your computer and use it in GitHub Desktop.
#I "../hopac/Libs/Hopac/bin/Release/net7.0/"
#r "Hopac.Core"
#r "Hopac.Platform"
#r "Hopac"
#load "./Bench.fs"
open System
open System.Threading
open Hopac.Extensions
open Hopac.Infixes
open Hopac
let rnd = Random()
let m,n = Console.BufferHeight-4, Console.BufferWidth-1
let scene = Job.thunk <| fun () ->
let scene = Array.init (m+2) (fun _ -> Array.init (n+2) (fun _ -> rnd.Next() % 2))
for i = 0 to m+1 do
scene[i][0] <- 0
scene[i][n+1] <- 0
for j = 0 to n+1 do
scene[0][j] <- 0
scene[m+1][j] <- 0
scene
let N = 15
let sleep = timeOutMillis (1000/N)
let lifeIter scene = Job.delay <| fun () ->
let before = Array.map Array.copy scene
seq {1..m}
|> Seq.Con.iterJob (fun i ->
seq {1..n}
|> Seq.Con.iterJob (fun j ->
Job.thunk <| fun () ->
let count =
before[i-1][j-1] + before[i-1][j] + before[i-1][j+1]
+ before[i][j-1] + before[i][j+1]
+ before[i+1][j-1] + before[i+1][j] + before[i+1][j+1]
scene[i][j] <-
match count, before[i][j] with
| 3, _ | 2, 1 -> 1
| _ -> 0
)
)
let show c (scene : int[][]) =
let symb = [|' '; c|]
Job.thunk <| fun () ->
Console.Clear()
[|
for i = 1 to m do
for j = 1 to n do
symb[scene[i][j]]
'\n'
|]
|> String
|> printfn "%s"
scene
run scene |> show '\u25A0' >>= lifeIter >>=. sleep
|> Job.forN 300
|> run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment