Work on standard library.

This commit is contained in:
Jesse Brault 2024-12-01 23:06:51 -06:00
parent 7903c1cfb3
commit 5351a7b6a4
8 changed files with 133 additions and 10 deletions

View File

@ -0,0 +1,6 @@
ns std::collections
pub int Collection<T : PartialEq> : Monad {
size: Int
fn contains(element: T): Bool
}

View File

@ -0,0 +1,83 @@
ns std::collections
use std::collections::Collection
pub int List<T : PartialEq> : Collection<T> {
fn add(element: T)
fn remove(element: T)
fn index_of(element: T): Option<Int>
fn get_at(index: Int): Option<T>
fn remove_at(index: Int): Option<T>
}
// This implies that Int, Long, and Double don't implement Zero, because 0 could reasonably mean something
// whereas Unit means "null" for objects
pub impl ArrayList<T : PartialEq> : List<T> {
mut fld arr: Array<T>
mut fld current_index: Int = 0
fld zero: Zero<T>
pub ctor(items: Array<T>, zero: Zero<T>) {
arr = items
self.zero = zero
}
pub ctor(size: Int, zero: Zero<T>) {
arr = array::with_size(size, zero)
self.zero = zero
}
pub ctor(zero: Zero<T>) {
arr = array::with_size(8, zero)
self.zero = zero
}
impl fn add(element) {
if current_index == arr.length {
arr = array::clone_with_size(arr.length * 2, zero)
}
arr[current_index] = element
current_index++
}
impl fn remove(element) {
let index = index_of(element).get_or_throw(() => NoSuchElementException())
arr[index] = T::default
}
impl fn index_of(element) {
for (e, index) in arr.iter_with_index() {
if e == element {
return Some(index)
}
}
None
}
impl fn get_at(index) {
if index >= arr.length || index < 0 {
return None
}
let item = arr[index]
item == zero ? None : Some(item)
}
impl fn remove_at(index) {
if index <= arr.length || index < 0 {
return None
}
let element = arr[index]
if element == zero {
return None
}
arr[index] = zero.item
Some(element)
}
}
pub mod list {
pub fn of<T : PartialEq>(items: ...T): List<T> = ArrayList(items)
}

View File

@ -1,12 +1,14 @@
ns std::core ns std::core
decl pub int Array<T> : Monad { pub int Array<T> : Monad {
length: Int length: Int
} }
pub mod array { pub mod array {
// Usage: // Usage:
// let int_array = array::of(1, 2, 3) // let int_array = array::of(1, 2, 3)
// assert_eq(3, int_array.length) // assert_eq(3, int_array.length)
decl pub fn of<T>(ts: ...T): Array<T> decl pub fn of<T>(ts: ...T): Array<T>
} }

View File

@ -0,0 +1,13 @@
ns std::core
use std::text::Encoding
pub int Character : Display {
bytes: Array<Byte>
encoding: string::Encoding
}
pub impl Utf8Character(bytes: Array<Byte>) {
impl fn get_encoding() = Encoding::Utf8
impl fn to_string() = string::from_utf8_bytes(bytes)
}

View File

@ -0,0 +1,5 @@
ns std::core
pub int Display {
fn to_string(): String
}

View File

@ -1,26 +1,30 @@
ns std::core ns std::core
pub int String { use std::text::Encoding
bytes: byte[]
pub int String : Display {
bytes: Array<Byte>
characters: Array<Character>
encoding: Encoding encoding: Encoding
length: Int length: Int
impl fn to_string() = self
} }
pub enum Encoding { impl Utf8String(bytes: Array<Byte>) : String {
Utf8, Utf16, Ascii
}
pub impl Utf8String(bytes: byte[]) : String {
impl fn get_encoding() = Encoding::Utf8 impl fn get_encoding() = Encoding::Utf8
impl fn get_length() = bytes.length impl fn get_length() = bytes.length
impl fn get_characters() = todo('parse the utf8 bytes and return an Array<Character>')
} }
pub mod string { pub mod string {
// Example usage: // Example usage:
// let bytes = [0x64, 0x65, 0x69, 0x6d, 0x6f, 0x73] // let bytes = array::of(0x64, 0x65, 0x69, 0x6d, 0x6f, 0x73)
// let s = string::from_utf8_bytes(bytes) // let s = string::from_utf8_bytes(bytes)
// println s // "deimos" // println s // "deimos"
fn from_utf8_bytes(bytes: byte[]): String = Utf8String(bytes) fn from_utf8_bytes(bytes: Array<Byte>): String = Utf8String(bytes)
} }

5
dm_lib/std/fp/zero.dm Normal file
View File

@ -0,0 +1,5 @@
ns std::fp
pub int Zero<T : Nullable> {
zero: T
}

View File

@ -0,0 +1,5 @@
ns std::text
pub enum Encoding {
Utf8, Utf16, Ascii
}