Skip to content

Instantly share code, notes, and snippets.

Avatar

Adrian Sinclair adrusi

View GitHub Profile
@adrusi
adrusi / generator.zig
Last active Jun 8, 2022
Generators in Zig 0.6.0
View generator.zig
const std = @import("std");
const debug = std.debug;
const builtin = @import("builtin");
const TypeInfo = builtin.TypeInfo;
const TypeId = builtin.TypeId;
/// Iterator based on async functions. Equivalent to generators in Python,
/// Javascript, etc.
///
@adrusi
adrusi / closure.zig
Created Jun 15, 2020
Userland implementation of closures in Zig
View closure.zig
const std = @import("std");
const assert = std.debug.assert;
pub fn closure(bindings: var) ClosureInternal(@TypeOf(bindings)) {
return ClosureInternal(@TypeOf(bindings)) { .ctx = bindings };
}
fn ClosureInternal(comptime Spec: type) type {
comptime {
const spec_tinfo = @typeInfo(Spec);
@adrusi
adrusi / kak.inc.sh
Last active Apr 10, 2022
andreyorst/powerline.kak: resize modeline dynamically base on window size
View kak.inc.sh
kakquote() {
out=
for text; do
out=$out"'"
while :; do
case "$text" in
*\'*)
out=$out${text%%\'*}\'\'
text=${text#*\'}
;;
@adrusi
adrusi / example.sh
Last active Apr 3, 2022
Full-featured argument parsing in non-forking POSIX shell
View example.sh
#!/bin/sh
source parse_args.inc.sh
arg_alias() {
case "$1" in
h) printf help;;
m) printf monitor;;
w) printf wait;;
r) printf rate; false;;
@adrusi
adrusi / async_generators.zig
Last active Jun 21, 2020
Async generators in Zig 0.6.0
View async_generators.zig
const std = @import("std");
const expectEqual = std.testing.expectEqual;
const expect = std.testing.expect;
const tuples = @import("tuples.zig");
const Tuple = tuples.Tuple;
const tuple = tuples.tuple;
const comptime_utils = @import("comptime_utils.zig");
@adrusi
adrusi / comptime_utils.zig
Created Jun 21, 2020
Tuples in Zig 0.6.0
View comptime_utils.zig
const std = @import("std");
const bufFmt = std.fmt.bufPrint;
pub fn compileErrorFmt(comptime fmt: []const u8, comptime args: var) void {
comptime {
var buf: [4096]u8 = undefined;
@compileError(@as([]const u8, bufFmt(&buf, fmt, args) catch |_| {
@compileError("compileFmt: output is too long. Cannot output @compileLogs longer than 4096 bytes");
}));
}
@adrusi
adrusi / rpn.js
Created Jun 18, 2011
A full interpreter for an rpn-based language written in under 300 lines of javascript.
View rpn.js
#!/usr/bin/env node
var input = require("fs").readFileSync(
require("path").join(process.cwd(), process.argv[process.argv.length - 1]),
"utf8"
);
var gvars = {};
function exec(input, fns, vars) {
(function findStrs() {
var inStr = false;
@adrusi
adrusi / gist:1905351
Created Feb 25, 2012
TCO in CoffeeScript
View gist:1905351
tco = (fn) -> (args...) ->
if @recured? or @args? or @recur?
unless arguments.callee.noWarn
# here we are taking precautionary measures to make sure we don't
# accidentally overwrite some important properties in the context named
# "recured", "args" or "recur". The warnings can be disabled by setting
# the `noWarn` property of the function to true
throw new Error """
calling a tail-recursive function in this context will overwrite the
properties "recured", "args" and "recur".
@adrusi
adrusi / petri.py
Created Oct 6, 2011
Simulates the population and growth of bacterial colonies. Requires a 256 color terminal.
View petri.py
from random import *
# from colors import *
import os
import math
import sys
import time
def gen_row(min, max):
return [randint(min, max) if random() <= 0.4 else 0 for i in range(0, 50)]
View command.js
var Kaffeine = require("./../lib/index"),
fs = require('fs'),
path = require('path'),
optparse = require('optparse'),
util = require("util"),
sources = [],
options = {},
oparser