Skip to content

Instantly share code, notes, and snippets.

View danielbodart's full-sized avatar

Daniel Worthington-Bodart danielbodart

View GitHub Profile
@danielbodart
danielbodart / whisper.sh
Last active March 4, 2026 17:12
A simple script using whisper.cpp to dictate into any input box on X11
#!/bin/bash
# Whisper Push-to-Talk Dictation Tool
# Runs whisper.cpp continuously, only processes output when key is held
set -euo pipefail
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
// Function to fetch paginated GitHub API responses
async function fetchPaginatedGitHubData(url: string, headers: Headers): Promise<any[]> {
let results: any[] = [];
let nextPageUrl: string | null = url;
while (nextPageUrl) {
const response: Response = await fetch(nextPageUrl, { headers });
const data = await response.json();
results = results.concat(data);
@danielbodart
danielbodart / TransducerChains.ts
Last active November 18, 2023 15:56
Experiment with TransducerChains
/**
* A transducer that can be applied synchronously
*/
export interface Transducer<A, B> {
/**
* Applies the transducer to the given iterable
*/
(iterable: Iterable<A>): Iterable<B>;
/**
@danielbodart
danielbodart / typesafe-mixin.ts
Last active October 12, 2023 06:36
Typesafe mixin using ECMAScript 2015 mixin class and class expressions
interface Constructor<T = object> {
new(...args: any[]): T;
}
interface Disposable {
dispose(): void;
}
function Disposable<T extends Constructor>(Base: T): T & Constructor<Disposable> {
return class extends Base implements Disposable {
@danielbodart
danielbodart / CallbackToAsyncIterator.ts
Created February 24, 2018 12:18
Callback to AsyncIterator in Typescript/Javascript
/*
* Usage:
* const message: IncomingMessage = ...
* const iterator = new AsyncIteratorHandler<string>();
* message.on("data", chunk => {
* iterator.handle({value: chunk.toString(), done: false});
* });
* this.message.on("end", () => {
* iterator.handle({value: null as any, done: true})
* });
<div class="application root">
<style src="../generated/bundle.css"></style>
<include src="../generated/bundle.svg" selector="svg"></include>
<decorator src="../header/header.html" selector=".header" content=".controls">
<svg class="close-logo">
<use xlink:href="#close-logo"></use>
</svg>
</decorator>
<include src="../popup/popup.html" selector=".popup"></include>
<decorator src="../footer/footer.html" selector=".footer">
@danielbodart
danielbodart / HtmlHandler.java
Last active January 17, 2017 20:13
Using Lagarto and csselly to do server composition (Support Server side as well as command line - for build time)
package fun;
import com.googlecode.totallylazy.Streams;
import com.googlecode.totallylazy.io.Uri;
import com.googlecode.utterlyidle.HttpHandler;
import com.googlecode.utterlyidle.Request;
import com.googlecode.utterlyidle.Response;
import com.googlecode.utterlyidle.handlers.ClientHttpHandler;
import com.googlecode.utterlyidle.html.RelativeUrlHandler;
import jodd.lagarto.dom.*;
#[derive(PartialEq, Debug)]
pub enum StartLine<'a> {
RequestLine (RequestLine<'a>),
StatusLine (StatusLine<'a>),
}
impl <'a> fmt::Display for StartLine<'a> {
fn fmt(&self, format: &mut fmt::Formatter) -> fmt::Result {
match self {
StartLine::RequestLine(rl) => rl.fmt(format),
fn get<'a>(headers: &'a Vec<(&str, String)>, name:&str) -> Option<&'a str> {
headers.into_iter().find(|&&(key,_)| name.eq_ignore_ascii_case(key)).map(|&(_,&value)|value)
} // ^^^^^^ expected struct `std::string::String`, found reference
pub fn message_body<'a>(slice: &'a [u8], headers:&Vec<(&str, String)>) -> IResult<&'a [u8], MessageBody<'a>> {
IResult::Done(slice, MessageBody::None)
}
apply!(message_body, &headers)