package core.map
-use core {array, hash, memory, math, conv}
+use core {array, hash, memory, math, conv, Optional}
use core.intrinsics.onyx { __initialize }
#local ValidKey :: interface (t: $T) {
key : K;
value : V;
}
-
}
#inject Map {
has :: has
get :: get
get_ptr :: get_ptr
+ get_opt :: get_opt
put :: put
delete :: delete
update :: update
return null;
}
+get_opt :: (use map: ^Map, key: map.Key_Type) -> Optional(map.Value_Type) {
+ lr := lookup(map, key);
+ if lr.entry_index >= 0 do return Optional.make(entries[lr.entry_index].value);
+
+ return .{};
+}
+
delete :: (use map: ^Map, key: map.Key_Type) {
lr := lookup(map, key);
if lr.entry_index < 0 do return;
--- /dev/null
+package core
+
+@conv.Custom_Format.{ #solidify format {T=Value_Type} }
+Optional :: struct (Value_Type: type_expr) {
+ has_value: bool;
+ value: Value_Type;
+}
+
+#inject Optional {
+ make :: (x: $T) => Optional(T).{ has_value = true, value = x };
+
+ value_or :: (o: Optional, default: o.Value_Type) -> o.Value_Type {
+ if !o.has_value do return default;
+ return o.value;
+ }
+
+ reset :: (o: ^Optional) {
+ o.has_value = false;
+ core.memory.set(^o.value, 0, sizeof o.Value_Type);
+ }
+
+ set :: (o: ^Optional, value: o.Value_Type) {
+ o.has_value = true;
+ o.value = value;
+ }
+
+ and_then :: (o: Optional($T), transform: (T) -> Optional($R)) -> Optional(R) {
+ if !o.has_value do return .{ false };
+ return transform(o.value);
+ }
+
+ transform :: (o: Optional($T), transform: (T) -> $R) -> Optional(R) {
+ if !o.has_value do return .{ false };
+ return Optional.make(transform(o.value));
+ }
+
+ or_else :: (o: Optional($T), generate: () -> Optional(T)) -> Optional(T) {
+ if o.has_value do return o;
+ return generate();
+ }
+
+ hash :: (o: Optional($T/core.hash.Hashable)) -> u32 {
+ if !o.has_value do return 0;
+ return core.hash.to_u32(o.value);
+ }
+
+ format :: (o: ^conv.Format_Output, format: ^conv.Format, opt: ^Optional($T)) {
+ if opt.has_value {
+ conv.format(o, "Some({\"})", opt.value);
+ } else {
+ o->write("None");
+ }
+ }
+}
+
+#operator == (o1, o2: Optional($T)) -> bool {
+ if o1.has_value != o2.has_value do return false;
+ if !o1.has_value do return true;
+ return o1.value == o2.value;
+}
+
+#overload
+__implicit_bool_cast :: macro (o: Optional) => o.has_value;
+
package core.set
-use core {array, hash, memory, math}
+use core {array, hash, memory, math, Optional}
#local SetValue :: interface (t: $T) {
{ hash.to_u32(t) } -> u32;
has :: has
get :: get
get_ptr :: get_ptr
+ get_opt :: get_opt
insert :: insert
remove :: remove
clear :: clear
return (^entries[lr.entry_index].value) if lr.entry_index >= 0 else null;
}
+get_opt :: (use set: ^Set, value: set.Elem_Type) -> Optional(set.Elem_Type) {
+ lr := lookup(set, value);
+ if lr.entry_index >= 0 do return Optional.make(entries[lr.entry_index].value);
+
+ return .{};
+}
+
remove :: (use set: ^Set, value: set.Elem_Type) {
lr := lookup(set, value);
if lr.entry_index < 0 do return;
#load "./container/bucket_array"
#load "./container/heap"
#load "./container/pair"
+#load "./container/optional"
#load "./conv/conv"
#load "./conv/format"
import * as vslc2 from "vscode-languageclient";
import * as vslc from "vscode-languageclient/node";
-import { TransportKind } from "vscode-languageclient/node";
let client: vslc.LanguageClient;
const engine = new vsctmls.textmateEngine.TextmateEngine('onyx', 'source.onyx');
const documentSymbolProvider = new vsctmls.documentSymbols.DocumentSymbolProvider(engine);
const workspaceSymbolProvider = new vsctmls.workspaceSymbols.WorkspaceSymbolProvider('onyx', documentSymbolProvider);
- // const foldingProvider = new vsctmls.folding.FoldingProvider(engine);
const peekFileDefinitionProvider = new vsctmls.peekDefinitions.PeekDefinitionProvider(documentSymbolProvider);
context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, documentSymbolProvider));
context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider));
- // context.subscriptions.push(vscode.languages.registerFoldingRangeProvider(selector, foldingProvider));
context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider));
- // client = new vslc.LanguageClient("onyx-lsp", {
- // command: "onyx-lsp",
- // transport: TransportKind.stdio,
- // }, {
- // documentSelector: [
- // { scheme: "file", language: "onyx" },
- // ],
- // synchronize: {
- // fileEvents: vscode.workspace.createFileSystemWatcher("**/*.onyx")
- // }
- // });
+ let serverOptions: vslc.ServerOptions = {
+ command: "onyx-lsp",
+ transport: vslc.TransportKind.stdio,
+ };
- // client.start();
+ let clientOptions: vslc.LanguageClientOptions = {
+ documentSelector: [
+ { scheme: "file", language: "onyx" },
+ ],
+ connectionOptions: {
+ cancellationStrategy: null,
+ maxRestartCount: 5
+ }
+ };
+
+ client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
+
+ client.start();
console.appendLine("Onyx Extension loaded.");
}
+
+export function deactivate(): Thenable<void> | undefined {
+ if (!client) {
+ return undefined;
+ }
+
+ return client.stop();
+}
});
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.activate = void 0;
+exports.deactivate = exports.activate = void 0;
const vscode = require("vscode");
const vsctmls = require("vscode-textmate-languageservice");
+const vslc = require("vscode-languageclient/node");
let client;
function activate(context) {
return __awaiter(this, void 0, void 0, function* () {
const engine = new vsctmls.textmateEngine.TextmateEngine('onyx', 'source.onyx');
const documentSymbolProvider = new vsctmls.documentSymbols.DocumentSymbolProvider(engine);
const workspaceSymbolProvider = new vsctmls.workspaceSymbols.WorkspaceSymbolProvider('onyx', documentSymbolProvider);
- // const foldingProvider = new vsctmls.folding.FoldingProvider(engine);
const peekFileDefinitionProvider = new vsctmls.peekDefinitions.PeekDefinitionProvider(documentSymbolProvider);
context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, documentSymbolProvider));
context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider));
- // context.subscriptions.push(vscode.languages.registerFoldingRangeProvider(selector, foldingProvider));
context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider));
- // client = new vslc.LanguageClient("onyx-lsp", {
- // command: "onyx-lsp",
- // transport: TransportKind.stdio,
- // }, {
- // documentSelector: [
- // { scheme: "file", language: "onyx" },
- // ],
- // synchronize: {
- // fileEvents: vscode.workspace.createFileSystemWatcher("**/*.onyx")
- // }
- // });
- // client.start();
+ let serverOptions = {
+ command: "onyx-lsp",
+ transport: vslc.TransportKind.stdio,
+ };
+ let clientOptions = {
+ documentSelector: [
+ { scheme: "file", language: "onyx" },
+ ],
+ connectionOptions: {
+ cancellationStrategy: null,
+ maxRestartCount: 5
+ }
+ };
+ client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
+ client.start();
console.appendLine("Onyx Extension loaded.");
});
}
exports.activate = activate;
+function deactivate() {
+ if (!client) {
+ return undefined;
+ }
+ return client.stop();
+}
+exports.deactivate = deactivate;
}
}
-
+static inline const char* bh_num_plural(u64 i) {
+ return i != 1 ? "s" : "";
+}
static inline const char* bh_num_suffix(u64 i) {
if (i == 11 || i == 12 || i == 13) return "th";