Skip to content

Instantly share code, notes, and snippets.

View nikoheikkila's full-sized avatar
🇺🇦
Stand with Ukraine

Niko Heikkilä nikoheikkila

🇺🇦
Stand with Ukraine
View GitHub Profile
@nikoheikkila
nikoheikkila / harvest.fish
Last active March 22, 2024 06:03
A quick way to record a new time entry using the official Harvest CLI package.
# A quick way to record a new time entry using the official Harvest CLI package.
# Usage: `hours duration [alias]`
# Create a new alias for a project/task mapping with `hrvst alias create` if needed.
function hours -d "Record new entry to Harvest" -a hours -a alias
__hrvst_auth
if test (count $argv) -eq 0
__total_hours
return 0
end
@nikoheikkila
nikoheikkila / Taskile.yml
Last active May 29, 2023 08:15
Global Task definitions for handling routine tasks across my computers.
# USAGE
#
# 1. Install Taskfile from <https://taskfile.dev>
# 2. Save this file to $HOME/Taskfile.yml
# 3. Run `task -g <name of the task>`
version: '3'
vars:
EDITOR: nvim # Set this to your preferred text editor
@nikoheikkila
nikoheikkila / CardGame.ts
Last active March 10, 2023 09:57
TypeScript version of the card game presented in the talk Domain Modelling Made Functional by Scott Wlaschin.
export enum Suit {
Club,
Diamond,
Spade,
Heart,
}
export enum Rank {
Two = 2,
Three,
@nikoheikkila
nikoheikkila / patcher.ts
Created March 1, 2023 17:14
Update TypeScript objects given a string path and a value.
const separator = ".";
const updateRecursively = <T extends Record<string, any>>(
data: T,
keys: string[],
value: unknown
): T => {
const [key] = keys;
if (keys.length === 1)
@nikoheikkila
nikoheikkila / fs-fake.ts
Last active February 28, 2023 06:57
In-Memory Filesystem Repository for Node.js & TypeScript
import * as fs from "node:fs/promises";
type Disk = Map<string, string>;
interface FileSystemAdapter {
readFile(path: string): Promise<string>;
writeFile(path: string, content: string): Promise<void>;
deleteFile(path: string): Promise<void>;
}
@nikoheikkila
nikoheikkila / directory_scanner.py
Last active October 22, 2022 08:16
General directory scanner implementation in pure Python
class PathScanner:
input_paths: list[str]
allowed_extensions: tuple[str]
def __init__(self, input_paths: list[str], allowed_extensions: tuple[str]) -> None:
self.input_paths = input_paths
self.allowed_extensions = allowed_extensions
def fetch_paths(self) -> list[str]:
result: list[str] = []
@nikoheikkila
nikoheikkila / poetry-update-all.py
Last active September 14, 2022 18:27
Python: Quick script to update all the existing Poetry packages by traversing pyproject.toml file.
#!/usr/bin/env python3
"""
Quick script to update all the existing Poetry packages by traversing pyproject.toml file.
Requires external package `tomli` to parse TOML file.
"""
import sys
from pathlib import Path
from shlex import split
from subprocess import CompletedProcess, run
from typing import Any
@nikoheikkila
nikoheikkila / it.fish
Created May 19, 2022 16:55
Fish Shell: Interactive runner for your Taskfile tasks
# Example: `it -v`, then press <ENTER> to pick a single task, or <TAB> to select multiple tasks and then <ENTER>
function it -d 'Run Taskfile tasks interactively'
task $argv (\
task --list \
| cut -d ' ' -f2 \
| tail -n +2 \
| sed 's/://' \
| sort \
| fzf -m --reverse --preview 'task --summary {}' \
@nikoheikkila
nikoheikkila / serialize_numpy.py
Created February 22, 2022 17:04
A quick way to serialize Numpy Array to JSON
from json import JSONEncoder, dumps
from typing import Any
import numpy as np
class NumpyEncoder(JSONEncoder):
def default(self, obj: object) -> Any:
if isinstance(obj, np.integer):
return int(obj)
if isinstance(obj, np.floating):
@nikoheikkila
nikoheikkila / createUser.ts
Created July 17, 2021 14:22
A simple example of refactoring a function in baby steps from returning to boolean all the way to Either monad.
// Option 1: true or false to indicate success
function createUser(id: string): boolean {
const user = User.getById(id);
if (!user) {
User.create(id);
return true;
}
return false;