From a8c030feb51b0984fac5366de94fd2e1c160c1df Mon Sep 17 00:00:00 2001 From: Yorkin Date: Mon, 10 Feb 2025 11:34:49 +0800 Subject: [PATCH] add optional type fix mbti --- moon.mod.json | 2 +- src/js/js.mbti | 9 +++++++++ src/js/optional.mbt | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/js/optional.mbt diff --git a/moon.mod.json b/moon.mod.json index 6daab3b..b0b28ca 100644 --- a/moon.mod.json +++ b/moon.mod.json @@ -1,6 +1,6 @@ { "name": "rami3l/js-ffi", - "version": "0.1.3", + "version": "0.1.4", "readme": "README.md", "repository": "", "license": "Apache-2.0", diff --git a/src/js/js.mbti b/src/js/js.mbti index f1b279a..14f32dd 100644 --- a/src/js/js.mbti +++ b/src/js/js.mbti @@ -51,6 +51,15 @@ impl Object { op_set[K, V](Self, K, V) -> Unit } +type Optional[_] +impl Optional { + from_option[T](T?) -> Self[T] + get_exn[T](Self[T]) -> T + is_undefined[T](Self[T]) -> Bool + to_option[T](Self[T]) -> T? + undefined[T]() -> Self[T] +} + pub type Promise[_] type Symbol diff --git a/src/js/optional.mbt b/src/js/optional.mbt new file mode 100644 index 0000000..841829b --- /dev/null +++ b/src/js/optional.mbt @@ -0,0 +1,32 @@ +///| +type Optional[_] + +///| +pub fn Optional::is_undefined[T](self : Optional[T]) -> Bool { + self |> Value::cast_from |> Value::is_undefined +} + +///| +pub fn Optional::get_exn[T](self : Optional[T]) -> T = "%identity" + +///| +pub fn Optional::to_option[T](self : Optional[T]) -> T? { + if Value::cast_from(self).is_undefined() { + None + } else { + Some(self.get_exn()) + } +} + +///| +pub fn Optional::undefined[T]() -> Optional[T] { + Value::undefined().cast() +} + +///| +pub fn Optional::from_option[T](value : T?) -> Optional[T] { + match value { + Some(v) => Value::cast_from(v).cast() + None => Optional::undefined() + } +}