Seconds-based timer protocols

This commit is contained in:
Tony Garnock-Jones 2023-02-06 16:08:12 +01:00
parent 7fdb251c4a
commit 32d4da6f86
10 changed files with 104 additions and 96 deletions

View File

@ -139,19 +139,19 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
<!-- then a file `src/index.js`: -->
<!-- ```javascript -->
<!-- const { TimeLaterThan } = activate require("@syndicate-lang/driver-timer"); -->
<!-- const { LaterThan } = activate require("@syndicate-lang/driver-timer"); -->
<!-- spawn named 'ticker' { -->
<!-- field this.counter = 0; -->
<!-- field this.deadline = +(new Date()); -->
<!-- field this.deadline = +(new Date()) / 1000.0; -->
<!-- on start { console.log('ticker starting'); } -->
<!-- on stop { console.log('ticker stopping'); } -->
<!-- on asserted TimeLaterThan(this.deadline) { -->
<!-- on asserted LaterThan(this.deadline) { -->
<!-- this.counter++; -->
<!-- console.log('tick', new Date(), this.counter); -->
<!-- this.deadline += 1000; -->
<!-- this.deadline += 1; -->
<!-- } -->
<!-- stop on (this.counter == 5); -->

View File

@ -22,7 +22,7 @@
- [DONE] `during/spawn`
- [DONE] `during`
- [DONE] `let { TimeLaterThan } = activate require("@syndicate-lang/driver-timer");`
- [DONE] `let { LaterThan } = activate require("@syndicate-lang/driver-timer");`
- [DONE] `react`
- [DONE] `spawn*` or similar - looks like `spawn on start { ... }` will do the trick
- [DONE] activation

View File

@ -109,12 +109,12 @@ function spawnGame(mainDs: Ref) {
on message WindowEvent('+keypress', $_e) => yvel.value = -10;
on message WindowEvent('+click', $_e) => yvel.value = -10;
const ms_per_tick = 1000.0 / 60;
const ms_per_tick_d = Double(ms_per_tick);
on message PeriodicTick(ms_per_tick_d) => {
xpos.value += 0.15 * ms_per_tick;
const seconds_per_tick = 1 / 60;
const seconds_per_tick_d = Double(seconds_per_tick);
on message PeriodicTick(seconds_per_tick_d) => {
xpos.value += 150 * seconds_per_tick;
ypos.value = (ypos.value + yvel.value);
yvel.value += ms_per_tick * 0.05;
yvel.value += seconds_per_tick * 50;
}
}
}

View File

@ -2,17 +2,17 @@
# yarn lockfile v1
"@preserves/core@>=0.20.2", "@preserves/core@^0.20.2":
version "0.20.2"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.20.2.tgz#37afa1f1770d0e667b4d384f717e648af745a7fa"
integrity sha512-6mZbhYuzAvgA4u2UpuyW2JI5in4h693AdrDTLXfrpv542tFFcI9XxGyL7AJ/CnwDxaX/0d9lRt7uTOrfJJ0uMw==
"@preserves/core@>=0.20.2", "@preserves/core@^0.20.5":
version "0.20.5"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.20.5.tgz#3b34693b1f5aff659639690725a703a95689f822"
integrity sha512-hnywtmY30swKSuHix3MbEoheyCh6plCERzmhnCQllrkhdT0hFm66iSr2PVjNsXAUNIwd3Rh3Vu2btgdjMK+Q9Q==
"@preserves/schema@>=0.21.2":
version "0.21.2"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.21.2.tgz#b8aff321e4971a7ff9275f33c499fab068da06bb"
integrity sha512-RZIIc2ETvRLC3sjjfFlyjJK3+6dlOK0N94E7lWPxK9c226vF4MU0CePi9ryRPBihgn5VdsjhCCfWXxt+te3IIw==
version "0.21.7"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.21.7.tgz#09e388b8c582c3dc95018ebdfe990381dddabfa8"
integrity sha512-q2gncEOOY3qqs+i+Op5yZx89cckqN601vbEcBDfnQge5PB9HrOrfMk68Wq4w/rpdQpRyVqWhZNxLlKsANjgoOw==
dependencies:
"@preserves/core" "^0.20.2"
"@preserves/core" "^0.20.5"
"@types/glob" "^7.1"
"@types/minimatch" "^3.0"
chalk "^4.1"
@ -30,48 +30,48 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.11.3":
version "0.11.3"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.11.3.tgz#77b491c896bf0a83776cb99224968fd979a5e086"
integrity sha512-2ru1hCsaBFQCrPMocUDmyT6GE3IYuqUMYtHwx2pwegH8xPdzz33aShrAmfSRcv56xC+kkGXpj6hS3e+pM2ks6A==
"@syndicate-lang/compiler@^0.11.6":
version "0.11.6"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.11.6.tgz#98f6016da98033ae7dac9daa0d601f625ea371a1"
integrity sha512-eIz9jqNz4lzf5s05ngefeX+NMS0c63ysL60rEB9bg+9IpWXYTBlZs0xQoy/3lw2igKZerUlOlOeu2kSkszBNDw==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.11.4":
version "0.11.4"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.11.4.tgz#995e2ad3d2594929b6b01f0a3c9c045f7fbcbe5b"
integrity sha512-6abI79+rbR0wC2kJeM/MUJNy8WQYTrtQwEcQOEXCCsfoj7KZ75wkzmC05B09Fu2URJpFzFRRaVKRyImx3oDWXA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.12.0":
version "0.12.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.12.0.tgz#dc30759789e322f1a4235ab7f7b0c6905e540a50"
integrity sha512-QwgQ+nh2krHsjVMPcSYL116bg/FgkJdMzlrd973TG2a+0PiapwevYetO72yK2Bw0PfRb0pjU2WN4UkwBYNvRJQ==
dependencies:
"@preserves/core" ">=0.20.2"
"@preserves/schema" ">=0.21.2"
"@syndicate-lang/html@*":
version "0.11.5"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.11.5.tgz#f1ed2aab0b37e848ffe88fbbd450d4140c670602"
integrity sha512-Y440cq+niz9SaoU5z79SCq44Q4SU59ILRW/gmwByYWTt3zt35zV8nYwn/QhylNU4OvrCkLNImIYtV4f8TSrNAg==
version "0.11.14"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.11.14.tgz#c81ddbe5ad5c768fedac15cb850f49e78c6e0c24"
integrity sha512-CcBzG/AKXwfvZbl0Py6l3bmQg9bd3EXUaKrluxkBdeBVBV1aZBVrk+//GfEtiFT8/KbQcOa6mnmaqPpQ/eft2g==
dependencies:
"@syndicate-lang/core" "^0.11.4"
"@syndicate-lang/core" "^0.12.0"
"@syndicate-lang/timer@*":
version "0.11.5"
resolved "https://registry.yarnpkg.com/@syndicate-lang/timer/-/timer-0.11.5.tgz#ad7240acaee014105ead719ba84ad99644a6ba5d"
integrity sha512-MxUHeFnng5fq73oaFj+bQ1Ce2ar0mj35DE05pCNj/EitljlhC8dohAd9x3jBX5DyeS/3+bNQnmJ+p6/af3dccw==
version "0.11.12"
resolved "https://registry.yarnpkg.com/@syndicate-lang/timer/-/timer-0.11.12.tgz#0dd2ddca9e254b79242a9b491019fb63c713c225"
integrity sha512-VpqKLf3kheKsdhNXcUJob/sQf0pWLdMNPUJ7HhWI/aieVNMb3FEGfgvnsiEpECQATO3/9QeF2fVwS4dygOqHmg==
dependencies:
"@syndicate-lang/core" "^0.11.4"
"@syndicate-lang/core" "^0.12.0"
"@syndicate-lang/ts-plugin@*":
version "0.11.5"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.11.5.tgz#afc62b4c73af28fab9c33b30cd78227983ab9f5f"
integrity sha512-LMZO1W9Qa4OvMMMInFXre9Lb9xcFVMG7EqrY3VpmH5OVV+/0CznaNKCmy7EwJJ/Oumuxniu9vSYZ6Mfs9W3ZQg==
version "0.11.12"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.11.12.tgz#2c42b0ee9dfa36e048dc6cf92c0ca81e5bfc86c1"
integrity sha512-fdbUL3OgWvK6SzpTqLVSLxzI855/Bb5WdPE6PFwQp/OKHiU1e8sZ1OGzjMs6t886JA7xForX/q/xM2vpA4Z3RA==
dependencies:
"@syndicate-lang/compiler" "^0.11.3"
"@syndicate-lang/core" "^0.11.4"
"@syndicate-lang/compiler" "^0.11.6"
"@syndicate-lang/core" "^0.12.0"
"@syndicate-lang/tsc@*":
version "0.11.5"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.11.5.tgz#67155080f357628b12014b842e00ceae8579e9d8"
integrity sha512-hOwQp7rFiwNaLj6r0LtdUEKe5eql8elWQuQDUbSz5DJ0mHuURDu4BdEH2yLdQEn1lyHz50R4Ze8UcLli4sIabA==
version "0.11.12"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.11.12.tgz#125e2af9e2d529587ad28e1d168f57960d6a0a35"
integrity sha512-ICHsGamBdanY13C9PwWgfgwzOgi3Vt9fOAtmTRX1E2TR1dAC4AbeGPFelgjVYASo3HXzuwliznxdh8MxlDY6fg==
dependencies:
"@syndicate-lang/compiler" "^0.11.3"
"@syndicate-lang/core" "^0.11.4"
"@syndicate-lang/compiler" "^0.11.6"
"@syndicate-lang/core" "^0.12.0"
glob "^7.1.6"
yargs "^16.2.0"
@ -88,15 +88,20 @@
"@types/minimatch" "*"
"@types/node" "*"
"@types/minimatch@*", "@types/minimatch@^3.0":
"@types/minimatch@*":
version "5.1.2"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/minimatch@^3.0":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/node@*":
version "17.0.12"
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.12.tgz#f7aa331b27f08244888c47b7df126184bc2339c5"
integrity sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==
version "18.11.19"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d"
integrity sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==
ansi-regex@^5.0.1:
version "5.0.1"
@ -111,9 +116,9 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
color-convert "^2.0.1"
anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
version "3.1.3"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
@ -200,12 +205,12 @@ commander@^7.2:
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
version "0.2.2"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
emoji-regex@^8.0.0:
version "8.0.0"
@ -232,7 +237,7 @@ fill-range@^7.0.1:
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2:
version "2.3.2"
@ -252,14 +257,14 @@ glob-parent@~5.1.2:
is-glob "^4.0.1"
glob@^7.1, glob@^7.1.6:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
@ -271,7 +276,7 @@ has-flag@^4.0.0:
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
@ -291,7 +296,7 @@ is-binary-path@~2.1.0:
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
@ -310,10 +315,10 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
minimatch@^3.0, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
minimatch@^3.0, minimatch@^3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
@ -325,14 +330,14 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2:
version "2.3.1"
@ -349,7 +354,7 @@ readdirp@~3.6.0:
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
rollup-plugin-sourcemaps@^0.6:
version "0.6.3"
@ -360,9 +365,9 @@ rollup-plugin-sourcemaps@^0.6:
source-map-resolve "^0.6.0"
rollup@^2.60:
version "2.66.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.66.1.tgz#366b0404de353c4331d538c3ad2963934fcb4937"
integrity sha512-crSgLhSkLMnKr4s9iZ/1qJCplgAgrRY+igWv8KhG/AjKOJ0YX/WpmANyn8oxrw+zenF3BXWDLa7Xl/QZISH+7w==
version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
optionalDependencies:
fsevents "~2.3.2"
@ -404,10 +409,10 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
typescript@^4.5:
version "4.5.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
typescript@^4.9:
version "4.9.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
wrap-ansi@^7.0.0:
version "7.0.0"
@ -421,7 +426,7 @@ wrap-ansi@^7.0.0:
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
y18n@^5.0.5:
version "5.0.8"

View File

@ -1,16 +1,19 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2023 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { preserves, Observe, floatValue, Turn, Ref } from "@syndicate-lang/core";
import { preserves, DoubleFloat, Observe, floatValue, Turn, Ref, Schemas } from "@syndicate-lang/core";
import { QuasiValue as Q } from "@syndicate-lang/core";
export message type PeriodicTick(intervalMS);
export assertion type TimeLaterThan(deadlineMS);
export message type PeriodicTick(interval: DoubleFloat);
export function sleep(ds: Ref, ms: number, cb: () => void): void {
export const LaterThan = Schemas.timer.LaterThan;
export type LaterThan = Schemas.timer.LaterThan;
export function sleep(ds: Ref, seconds: number, cb: () => void): void {
react {
at ds {
stop on asserted TimeLaterThan(+(new Date()) + ms) {
const deadline = +(new Date()) / 1000.0 + seconds;
stop on asserted LaterThan(deadline) {
cb();
}
}
@ -21,30 +24,30 @@ export function boot(ds: Ref) {
spawn named 'timer/PeriodicTick' {
at ds {
during Observe({
"pattern": :pattern PeriodicTick(\Q.lit($intervalMS))
}) => spawn named (preserves`PeriodicTick(${intervalMS})`) {
"pattern": :pattern PeriodicTick(\Q.lit($interval: DoubleFloat))
}) => spawn named (preserves`PeriodicTick(${interval})`) {
const thisFacet = Turn.activeFacet;
thisFacet.preventInertCheck();
const handle = setInterval(() => thisFacet.turn(() => {
send message PeriodicTick(intervalMS);
}), floatValue(intervalMS));
send message PeriodicTick(interval);
}), floatValue(interval) * 1000.0);
on stop clearInterval(handle);
}
}
}
spawn named 'timer/TimeLaterThan' {
spawn named 'timer/LaterThan' {
at ds {
during Observe({
"pattern": :pattern TimeLaterThan(\Q.lit($deadlineMS))
}) => spawn named (preserves`TimeLaterThan(${deadlineMS})`) {
"pattern": :pattern LaterThan(\Q.lit($deadline: DoubleFloat))
}) => spawn named (preserves`LaterThan(${deadline})`) {
const thisFacet = Turn.activeFacet;
thisFacet.preventInertCheck();
let delta = floatValue(deadlineMS) - (+(new Date()));
let delta = floatValue(deadline) * 1000.0 - (+(new Date()));
let handle: any | null = setTimeout(() => thisFacet.turn(() => {
handle = null;
react {
assert TimeLaterThan(deadlineMS);
assert LaterThan(floatValue(deadline));
}
}), delta);
on stop if (handle) {

View File

@ -60,7 +60,7 @@ spawn named 'IPRouteDatabase' {
return rec;
});
react {
stop on message PeriodicTick(5000) refresh();
stop on message PeriodicTick(5) refresh();
data.forEach((rec) => {
const destnet = littleEndianHex(rec.Destination);
const destmask = 32 - countZeroBits(littleEndianHex(rec.Mask));

View File

@ -96,7 +96,7 @@ spawn named 'docker-scan' {
}));
}
on start scan();
on message PeriodicTick(5000) scan();
on message PeriodicTick(5) scan();
on message DockerContainers($containers0) {
const containers = containers0.toJSON();

View File

@ -33,7 +33,7 @@ spawn named 'demo' {
console.log(data);
}
on message PeriodicTick(1000) {
on message PeriodicTick(1) {
send WS.DataOut(wsId, Bytes.from(genUuid('timestamp')));
}
}

View File

@ -38,7 +38,7 @@ spawn named 'multicast_demo' {
console.log('Got', body, 'from', host, port);
}
on message PeriodicTick(2000) {
on message PeriodicTick(2) {
send U.UdpPacket(HANDLE, U.UdpPeer(GROUP_ADDRESS, PORT), genUuid('timestamp'));
}
}

View File

@ -41,7 +41,7 @@ spawn named 'workerMain' {
assert Outbound(Tack(me + ' ' + this.count));
on message PeriodicTick(1000) {
on message PeriodicTick(1) {
console.log('tick', me, this.count);
send Outbound(Tick(me, this.count++));
}