mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
154 lines
6.4 KiB
Nim
154 lines
6.4 KiB
Nim
#
|
|
#
|
|
# Nim's Runtime Library
|
|
# (c) Copyright 2018 Nim contributors
|
|
#
|
|
# See the file "copying.txt", included in this
|
|
# distribution, for details about the copyright.
|
|
#
|
|
|
|
## This module wraps core JavaScript functions.
|
|
##
|
|
## Unless your application has very
|
|
## specific requirements and solely targets JavaScript, you should be using
|
|
## the relevant functions in the `math`, `json`, and `times` stdlib
|
|
## modules instead.
|
|
import std/private/[since, jsutils]
|
|
|
|
when not defined(js):
|
|
{.error: "This module only works on the JavaScript platform".}
|
|
|
|
type
|
|
MathLib* = ref object
|
|
JsonLib* = ref object
|
|
DateLib* = ref object
|
|
DateTime* = ref object
|
|
|
|
var
|
|
Math* {.importc, nodecl.}: MathLib
|
|
Date* {.importc, nodecl.}: DateLib
|
|
JSON* {.importc, nodecl.}: JsonLib
|
|
|
|
# Math library
|
|
proc abs*(m: MathLib, a: SomeNumber): SomeNumber {.importcpp.}
|
|
proc acos*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc acosh*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc asin*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc asinh*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc atan*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc atan2*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc atanh*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc cbrt*(m: MathLib, f: SomeFloat): SomeFloat {.importcpp.}
|
|
proc ceil*(m: MathLib, f: SomeFloat): SomeFloat {.importcpp.}
|
|
proc clz32*(m: MathLib, f: SomeInteger): int {.importcpp.}
|
|
proc cos*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc cosh*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc exp*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc expm1*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc floor*(m: MathLib, f: SomeFloat): int {.importcpp.}
|
|
proc fround*(m: MathLib, f: SomeFloat): float32 {.importcpp.}
|
|
proc hypot*(m: MathLib, args: varargs[distinct SomeNumber]): float {.importcpp.}
|
|
proc imul*(m: MathLib, a, b: int32): int32 {.importcpp.}
|
|
proc log*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc log10*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc log1p*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc log2*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc max*(m: MathLib, a, b: SomeNumber): SomeNumber {.importcpp.}
|
|
proc min*[T: SomeNumber | JsRoot](m: MathLib, a, b: T): T {.importcpp.}
|
|
proc pow*(m: MathLib, a, b: distinct SomeNumber): float {.importcpp.}
|
|
proc random*(m: MathLib): float {.importcpp.}
|
|
proc round*(m: MathLib, f: SomeFloat): int {.importcpp.}
|
|
proc sign*(m: MathLib, f: SomeNumber): int {.importcpp.}
|
|
proc sin*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc sinh*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc sqrt*(m: MathLib, f: SomeFloat): SomeFloat {.importcpp.}
|
|
proc tan*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc tanh*(m: MathLib, a: SomeNumber): float {.importcpp.}
|
|
proc trunc*(m: MathLib, f: SomeFloat): int {.importcpp.}
|
|
|
|
# Date library
|
|
proc now*(d: DateLib): int {.importcpp.}
|
|
proc UTC*(d: DateLib): int {.importcpp.}
|
|
proc parse*(d: DateLib, s: cstring): int {.importcpp.}
|
|
|
|
proc newDate*(): DateTime {.
|
|
importcpp: "new Date()".}
|
|
|
|
proc newDate*(date: int|string): DateTime {.
|
|
importcpp: "new Date(#)".}
|
|
|
|
whenJsNoBigInt64:
|
|
proc newDate*(date: int64): DateTime {.
|
|
importcpp: "new Date(#)".}
|
|
do:
|
|
proc newDate*(date: int64): DateTime {.
|
|
importcpp: "new Date(Number(#))".}
|
|
|
|
proc newDate*(year, month, day, hours, minutes,
|
|
seconds, milliseconds: int): DateTime {.
|
|
importcpp: "new Date(#,#,#,#,#,#,#)".}
|
|
|
|
proc getDay*(d: DateTime): int {.importcpp.}
|
|
proc getFullYear*(d: DateTime): int {.importcpp.}
|
|
proc getHours*(d: DateTime): int {.importcpp.}
|
|
proc getMilliseconds*(d: DateTime): int {.importcpp.}
|
|
proc getMinutes*(d: DateTime): int {.importcpp.}
|
|
proc getMonth*(d: DateTime): int {.importcpp.}
|
|
proc getSeconds*(d: DateTime): int {.importcpp.}
|
|
proc getTime*(d: DateTime): int {.importcpp.}
|
|
proc getTimezoneOffset*(d: DateTime): int {.importcpp.}
|
|
proc getUTCDate*(d: DateTime): int {.importcpp.}
|
|
proc getUTCDay*(d: DateTime): int {.importcpp.}
|
|
proc getUTCFullYear*(d: DateTime): int {.importcpp.}
|
|
proc getUTCHours*(d: DateTime): int {.importcpp.}
|
|
proc getUTCMilliseconds*(d: DateTime): int {.importcpp.}
|
|
proc getUTCMinutes*(d: DateTime): int {.importcpp.}
|
|
proc getUTCMonth*(d: DateTime): int {.importcpp.}
|
|
proc getUTCSeconds*(d: DateTime): int {.importcpp.}
|
|
proc getYear*(d: DateTime): int {.importcpp.}
|
|
|
|
proc setFullYear*(d: DateTime, year: int) {.importcpp.}
|
|
|
|
func toDateString*(d: DateTime): cstring {.importcpp.}
|
|
func toISOString*(d: DateTime): cstring {.importcpp.}
|
|
func toJSON*(d: DateTime): cstring {.importcpp.}
|
|
proc toString*(d: DateTime): cstring {.importcpp.}
|
|
func toTimeString*(d: DateTime): cstring {.importcpp.}
|
|
func toUTCString*(d: DateTime): cstring {.importcpp.}
|
|
|
|
#JSON library
|
|
proc stringify*(l: JsonLib, s: JsRoot): cstring {.importcpp.}
|
|
proc parse*(l: JsonLib, s: cstring): JsRoot {.importcpp.}
|
|
|
|
|
|
since (1, 5):
|
|
func debugger*() {.importjs: "debugger@".}
|
|
## https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger
|
|
|
|
func copyWithin*[T](self: openArray[T]; target: int): seq[T] {.importjs: "#.copyWithin(#)".}
|
|
func copyWithin*[T](self: openArray[T]; target, start: int): seq[T] {.importjs: "#.copyWithin(#, #)".}
|
|
func copyWithin*[T](self: openArray[T]; target, start, ends: int): seq[T] {.importjs: "#.copyWithin(#, #, #)".} =
|
|
## https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/copyWithin
|
|
## `copyWithin` uses shallow copy.
|
|
runnableExamples:
|
|
assert ['a', 'b', 'c', 'd', 'e'].copyWithin(0, 3, 4) == @['d', 'b', 'c', 'd', 'e']
|
|
assert ['a', 'b', 'c', 'd', 'e'].copyWithin(1, 3) == @['a', 'd', 'e', 'd', 'e']
|
|
assert [1, 2, 3, 4, 5].copyWithin(-2) == @[1, 2, 3, 1, 2]
|
|
assert [1, 2, 3, 4, 5].copyWithin(0, 3) == @[4, 5, 3, 4, 5]
|
|
assert [1, 2, 3, 4, 5].copyWithin(0, 3, 4) == @[4, 2, 3, 4, 5]
|
|
assert [1, 2, 3, 4, 5].copyWithin(-2, -3, -1) == @[1, 2, 3, 3, 4]
|
|
|
|
|
|
since (1, 7):
|
|
func shift*[T](self: seq[T]): T {.importjs: "#.$1()".} =
|
|
## https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift
|
|
runnableExamples:
|
|
var arrai = @[1, 2, 3]
|
|
assert arrai.shift() == 1
|
|
assert arrai == @[2, 3]
|
|
|
|
func queueMicrotask*(function: proc) {.importjs: "$1(#)".} =
|
|
## * https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask
|
|
## * https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide
|
|
runnableExamples"-r:off": queueMicrotask(proc() = echo "Microtask")
|