Work on standard library.
This commit is contained in:
parent
7903c1cfb3
commit
5351a7b6a4
6
dm_lib/std/collections/collection.dm
Normal file
6
dm_lib/std/collections/collection.dm
Normal file
@ -0,0 +1,6 @@
|
||||
ns std::collections
|
||||
|
||||
pub int Collection<T : PartialEq> : Monad {
|
||||
size: Int
|
||||
fn contains(element: T): Bool
|
||||
}
|
83
dm_lib/std/collections/list.dm
Normal file
83
dm_lib/std/collections/list.dm
Normal 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)
|
||||
}
|
@ -1,12 +1,14 @@
|
||||
ns std::core
|
||||
|
||||
decl pub int Array<T> : Monad {
|
||||
pub int Array<T> : Monad {
|
||||
length: Int
|
||||
}
|
||||
|
||||
pub mod array {
|
||||
|
||||
// Usage:
|
||||
// let int_array = array::of(1, 2, 3)
|
||||
// assert_eq(3, int_array.length)
|
||||
decl pub fn of<T>(ts: ...T): Array<T>
|
||||
|
||||
}
|
||||
|
13
dm_lib/std/core/character.dm
Normal file
13
dm_lib/std/core/character.dm
Normal 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)
|
||||
}
|
5
dm_lib/std/core/display.dm
Normal file
5
dm_lib/std/core/display.dm
Normal file
@ -0,0 +1,5 @@
|
||||
ns std::core
|
||||
|
||||
pub int Display {
|
||||
fn to_string(): String
|
||||
}
|
@ -1,26 +1,30 @@
|
||||
ns std::core
|
||||
|
||||
pub int String {
|
||||
bytes: byte[]
|
||||
use std::text::Encoding
|
||||
|
||||
pub int String : Display {
|
||||
|
||||
bytes: Array<Byte>
|
||||
characters: Array<Character>
|
||||
encoding: Encoding
|
||||
length: Int
|
||||
|
||||
impl fn to_string() = self
|
||||
|
||||
}
|
||||
|
||||
pub enum Encoding {
|
||||
Utf8, Utf16, Ascii
|
||||
}
|
||||
|
||||
pub impl Utf8String(bytes: byte[]) : String {
|
||||
impl Utf8String(bytes: Array<Byte>) : String {
|
||||
impl fn get_encoding() = Encoding::Utf8
|
||||
impl fn get_length() = bytes.length
|
||||
impl fn get_characters() = todo('parse the utf8 bytes and return an Array<Character>')
|
||||
}
|
||||
|
||||
pub mod string {
|
||||
|
||||
// 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)
|
||||
// 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
5
dm_lib/std/fp/zero.dm
Normal file
@ -0,0 +1,5 @@
|
||||
ns std::fp
|
||||
|
||||
pub int Zero<T : Nullable> {
|
||||
zero: T
|
||||
}
|
5
dm_lib/std/text/encoding.dm
Normal file
5
dm_lib/std/text/encoding.dm
Normal file
@ -0,0 +1,5 @@
|
||||
ns std::text
|
||||
|
||||
pub enum Encoding {
|
||||
Utf8, Utf16, Ascii
|
||||
}
|
Loading…
Reference in New Issue
Block a user