2025-09-06 06:24:08 +09:00
|
|
|
// std.string (Ny) - Phase15 MVP
|
|
|
|
|
// Usage:
|
2025-11-06 15:41:52 +09:00
|
|
|
// include "apps/std/string.hako"
|
2025-09-06 06:24:08 +09:00
|
|
|
// StdStringNy.string_length("abc"), StdStringNy.string_concat("a","b"),
|
|
|
|
|
// StdStringNy.string_slice("hello",1,4), StdStringNy.string_index_of("banana","na"), StdStringNy.string_equals("x","y")
|
|
|
|
|
// Notes:
|
|
|
|
|
// - ASCII only; slice clamps [start,end)
|
|
|
|
|
// - index_of returns -1 when not found
|
|
|
|
|
// - Pure functions; no side effects
|
|
|
|
|
|
|
|
|
|
static box StdStringNy {
|
|
|
|
|
// Return length of string s (Integer)
|
|
|
|
|
string_length(s) {
|
|
|
|
|
if s == null { return 0 }
|
|
|
|
|
return s.length()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Concatenate two strings
|
|
|
|
|
string_concat(a, b) {
|
|
|
|
|
return a.concat(b)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Slice string in [start, end) with simple clamping
|
|
|
|
|
string_slice(s, start, end) {
|
|
|
|
|
if s == null { return "" }
|
|
|
|
|
return s.substring(start, end)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Return first index of substring (or -1)
|
|
|
|
|
string_index_of(s, sub) {
|
|
|
|
|
if s == null { return -1 }
|
|
|
|
|
if sub == null { return 0 }
|
|
|
|
|
local n, m, i
|
|
|
|
|
n = s.length()
|
|
|
|
|
m = sub.length()
|
|
|
|
|
if m == 0 { return 0 }
|
|
|
|
|
if n < m { return -1 }
|
|
|
|
|
i = 0
|
|
|
|
|
loop (i <= (n - m)) {
|
|
|
|
|
// Compare window
|
|
|
|
|
if s.substring(i, i + m) == sub { return i }
|
|
|
|
|
i = i + 1
|
|
|
|
|
}
|
|
|
|
|
return -1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Return 1 if equal else 0 (Integer)
|
|
|
|
|
string_equals(a, b) {
|
|
|
|
|
if a == b { return 1 }
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
}
|