spwn 0.0.6

A language for Geometry Dash triggers
Documentation
#[no_std, cache_output]
import "array.spwn"

type @dict_not_found;

impl @dictionary {
	is_empty: #[desc("Returns true if there are no entries in the dictionary, false otherwise.") example("
dict = {}
$.assert(dict.is_empty())
	")]
	(self) {
		// no way to get number of entries currently afaik
		// so this 'loop' will get skipped over if empty,
		// or otherwise early exit on the first entry if not
		for kv in self {
			return false;
		}
		return true;
	},
	keys: #[desc("Gets the dictionary's keys.") example("
wares = {
	apple: 10,
	gold: 1000,
	peanuts: 5,
}
$.assert(wares.keys() == ['apple', 'gold', 'peanuts'])
	")]
	(self) {
		let ret = []
		for kv in self {
			ret.push(kv[0])
		}
		return ret
	},
	values: #[desc("Gets the dictionary's values.") example("
wares = {
	apple: 10,
	gold: 1000,
	peanuts: 5,
}
$.assert(wares.values() == [10, 1000, 5])
	")]
	(self) {
		let ret = []
		for kv in self {
			ret.push(kv[1])
		}
		return ret
	},
	items: #[desc("Gets the dictionary's items.") example("
wares = {
	apple: 10,
	gold: 1000,
	peanuts: 5,
}
$.assert(wares.items() == [
	['apple', 10],
	['gold', 1000],
	['peanuts', 5],
])
	")]
	(self) {
		let ret = []
		for kv in self {
			ret.push(kv)
		}
		return ret
	},
	set: #[desc("Sets an item in the dictionary.") example("
let wares = {
	apple: 10,
	gold: 1000,
}
wares.set('peanuts', 5)
$.assert(wares == {
	apple: 10,
	gold: 1000,
	peanuts: 5,
})
	")]
	(self, key: @string, val) {
		if self has key {
			self[key] = val
		} else {
			let self[key] = val
		}
	},
	get: #[desc("Gets an item from the dictionary.") example("
let wares = {
	apple: 10,
	gold: 1000,
	peanuts: 5,
}

$.assert(wares.get('peanuts') == 5)
$.assert(wares.get('silver', default = 42) == 42)
	")]
	(self, key: @string, default = @dict_not_found::{}) {
		if self has key {
			return self[key]
		} else {
			if default.type == @dict_not_found {
				throw "Key doesn't exist and no fallback was provided"
			} else {
				return default
			}
		}
	},
	clear: #[desc("Clears the dictionary.") example("
let wares = {
	apple: 10,
	gold: 1000,
	peanuts: 5,
}
wares.clear()

$.assert(wares.is_empty())
	")]
	(self) {
		self = {}
	},
	contains_value: #[desc("Checks if the dictionary contains a value.") example("
let wares = {
	apple: 10,
	gold: 1000,
	peanuts: 5,
}

$.assert(wares.contains(5))
	")]
	(self, value) {
		return self.values().contains(value)
	}
}