diff --git a/compiler/test/stdlib/string.test.gr b/compiler/test/stdlib/string.test.gr
index 7d99fa93fa..f9366c8141 100644
--- a/compiler/test/stdlib/string.test.gr
+++ b/compiler/test/stdlib/string.test.gr
@@ -63,6 +63,12 @@ assert String.byteLength("a") == 1
assert String.byteLength(emoji) == 4
assert String.byteLength(emojis) == 98
+// String.isEmpty
+assert String.isEmpty(empty) == true
+assert String.isEmpty(short) == false
+assert String.isEmpty(emoji) == false
+assert String.isEmpty(emojis) == false
+
// indexOf tests
assert String.indexOf(empty, empty) == Some(0)
assert String.indexOf(empty, short) == Some(0)
diff --git a/stdlib/string.gr b/stdlib/string.gr
index d22b46f619..385ef3c95b 100644
--- a/stdlib/string.gr
+++ b/stdlib/string.gr
@@ -98,6 +98,21 @@ provide let byteLength = (string: String) => {
Conv.wasmI32ToNumber(WasmI32.load(string, 4n))
}
+/**
+ * Determines if the string contains no characters.
+ *
+ * @param string: The string to inspect
+ * @returns `true` if the string is empty and `false` otherwise
+ *
+ * @since v0.6.0
+ */
+@unsafe
+provide let isEmpty = (string: String) => {
+ from WasmI32 use { (==) }
+ let strPtr = WasmI32.fromGrain(string)
+ WasmI32.load(strPtr, 4n) == 0n
+}
+
/**
* Finds the first position of a substring in the input string.
*
diff --git a/stdlib/string.md b/stdlib/string.md
index 2510d78aae..23e9898e6e 100644
--- a/stdlib/string.md
+++ b/stdlib/string.md
@@ -137,6 +137,31 @@ Examples:
String.byteLength("🌾") == 4
```
+### String.**isEmpty**
+
+
+Added in next
+No other changes yet.
+
+
+```grain
+isEmpty : (string: String) => Bool
+```
+
+Determines if the string contains no characters.
+
+Parameters:
+
+|param|type|description|
+|-----|----|-----------|
+|`string`|`String`|The string to inspect|
+
+Returns:
+
+|type|description|
+|----|-----------|
+|`Bool`|`true` if the string is empty and `false` otherwise|
+
### String.**indexOf**