From 1f19cba76f547648ea97f51f2c78a76f2ad2c315 Mon Sep 17 00:00:00 2001 From: Dag Brattli Date: Sun, 18 Oct 2026 22:48:47 +0200 Subject: [PATCH] feat: add Erlang binary and number predicates --- src/otp/Erlang.fs | 8 ++++++++ test/TestErlang.fs | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/otp/Erlang.fs b/src/otp/Erlang.fs index 7d28995..152fee0 100644 --- a/src/otp/Erlang.fs +++ b/src/otp/Erlang.fs @@ -138,6 +138,14 @@ let exactEquals (a: 'T) (b: 'T) : bool = nativeOnly [] let isList (term: 'T) : bool = nativeOnly +/// Returns true if Term is an Erlang binary (a bitstring of whole bytes). +[] +let isBinary (term: 'T) : bool = nativeOnly + +/// Returns true if Term is an Erlang integer or float, without converting it. +[] +let isNumber (term: 'T) : bool = nativeOnly + // ============================================================================ // Time // ============================================================================ diff --git a/test/TestErlang.fs b/test/TestErlang.fs index d1f0355..80036f3 100644 --- a/test/TestErlang.fs +++ b/test/TestErlang.fs @@ -40,6 +40,35 @@ let tests = assertThat (Erlang.exactEquals ref1 ref1) (isTrue) ) + test ( + "isBinary accepts binaries and rejects other terms", + fun _ -> + assertThat (Erlang.isBinary "hello") (isTrue) + assertThat (Erlang.isBinary "") (isTrue) + assertThat (Erlang.isBinary 42) (isFalse) + assertThat (Erlang.isBinary (Atom.ofString "hello")) (isFalse) + + let charlist: Dynamic = emitErlExpr () "[104, 101, 108, 108, 111]" + let partialByte: Dynamic = emitErlExpr () "<<7:12>>" + assertThat (Erlang.isBinary charlist) (isFalse) + assertThat (Erlang.isBinary partialByte) (isFalse) + ) + + test ( + "isNumber accepts integers and floats without accepting other terms", + fun _ -> + assertThat (Erlang.isNumber 42) (isTrue) + assertThat (Erlang.isNumber 1.5) (isTrue) + assertThat (Erlang.isNumber -2) (isTrue) + assertThat (Erlang.isNumber "42") (isFalse) + assertThat (Erlang.isNumber (Atom.ofString "forty_two")) (isFalse) + + let list: Dynamic = emitErlExpr () "[1, 2]" + let tuple: Dynamic = emitErlExpr () "{1, 2}" + assertThat (Erlang.isNumber list) (isFalse) + assertThat (Erlang.isNumber tuple) (isFalse) + ) + test ( "spawn creates a process", fun _ ->