Skip to content

Instantly share code, notes, and snippets.

@adrusi
adrusi / generator.zig
Last active March 10, 2024 15:09
Generators in Zig 0.6.0
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 June 15, 2020 19:04
Userland implementation of closures in 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 April 10, 2022 01:56
andreyorst/powerline.kak: resize modeline dynamically base on window size
kakquote() {
out=
for text; do
out=$out"'"
while :; do
case "$text" in
*\'*)
out=$out${text%%\'*}\'\'
text=${text#*\'}
;;
@adrusi
adrusi / example.sh
Last active April 3, 2022 00:46
Full-featured argument parsing in non-forking POSIX shell
#!/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 June 21, 2020 23:12
Async generators in Zig 0.6.0
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 June 21, 2020 20:57
Tuples in Zig 0.6.0
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 June 18, 2011 00:22
A full interpreter for an rpn-based language written in under 300 lines of javascript.
#!/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 February 25, 2012 02:21
TCO in CoffeeScript
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 October 6, 2011 03:13
Simulates the population and growth of bacterial colonies. Requires a 256 color terminal.
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)]
var Kaffeine = require("./../lib/index"),
fs = require('fs'),
path = require('path'),
optparse = require('optparse'),
util = require("util"),
sources = [],
options = {},
oparser