Skip to content

Instantly share code, notes, and snippets.

View mklbtz's full-sized avatar

Michael Bates mklbtz

View GitHub Profile
// From: http://www.figure.ink/blog/2019/11/9/parse-dont-validate
// Original: https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/#2019-11-05-parse-don-t-validate-footnote-1-return
/* Haskell
head :: [a] -> a
head (x:_) = x
*/
func head<A>(_ array: [A]) -> A {
return array[0] // Crashes at runtime when array is empty.
}
@mklbtz
mklbtz / Swift.sublime-build
Last active August 21, 2019 19:37
Use Xcode to run Swift CLI, file regex included
{
"selector": "source.swift",
"shell_cmd": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift \"${file}\"",
"file_regex": "^(.+\\.swift):([0-9]+):?([0-9]+)?:? (?:error|warning|note): (.*)$"
}
@mklbtz
mklbtz / displays.scpt
Created September 26, 2018 13:15
AppleScript that will open System Preferences and rotate displays to a preconfigured orientation
on launchDisplaysPane()
tell application "System Preferences"
activate
set displayPane to pane "com.apple.preference.displays"
set displayTab to anchor named "displaysDisplayTab" of displayPane
reveal displayTab
delay 0.5
end tell
end launchDisplaysPane
@mklbtz
mklbtz / Stopwatch.py
Last active October 8, 2018 16:08
Stopwatch - A simple class for taking time hacks.
from datetime import datetime, timedelta
import sys
class Stopwatch:
def __init__(self):
self._hacks = []
@property
def laps(self):
return len(self._hacks) - 1
@mklbtz
mklbtz / longings.py
Last active December 20, 2018 18:26
Things I already wish I had in Python
from __future__ import print_function
class NoneError(TypeError):
pass
class maybe:
"""
A two-state monad that represents the presents or absence of a value.
Think of it as a collection of zero or one values.
"""
@mklbtz
mklbtz / SketchSystems.spec
Last active June 1, 2018 16:00
No Opportunities*
No Opportunities*
parts uploaded -> Estimate Requested
Estimate Requested
Reviewing Parts*
Unclean*
redact prints -> Reviewing Parts
upload dummies -> Reviewing Parts
all parts clean -> Clean
Clean
@mklbtz
mklbtz / README.md
Last active May 22, 2018 05:14
Some Unix-y command line tools written in Swift

In the course of time, I found myself wanting to run RSpec automatically in response to file changes. I found a nice tool called fswatch to handle the file events, but I wanted a "smarter" pipeline. Following the Unix philosophy, I wrote a few tiny command line tools which I've provided the source to.

  • specname — maps a file in a rails project to its corresponding spec file.
  • debounce — makes sure multiple rapid saves don't trigger as many RSpec runs.
  • throttle — could be used to collect multiple file changes into one RSpec run, but I haven't figured that last part out yet.

The core functions are fully generic and have no dependencies on anything but Foundation, so they could be easily incorporated into a larger project if there's a use for them.

@mklbtz
mklbtz / Final-Tagless Views.rb
Created May 21, 2018 22:15
Demonstrating the "final tagless" approach to the "Expression Problem" in Ruby
class View
def self.image(url:)
Image.new.tap { |img| img.url = url }
end
def self.button(title:)
Button.new.tap { |btn| btn.title = title }
end
def self.stack(subviews)
@mklbtz
mklbtz / new-data-literal.md
Created March 24, 2018 19:13
SE Proposal: New literal for Data from contents of file

New literal for Data from contents of file

  • Proposal: SE-NNNN
  • Authors: Michael Bates
  • Review Manager: TBD
  • Status: Awaiting implementation

Introduction

In Swift today, literals give us the ability to embed files, images, and colors directly into our programs. This proposes a new literal that will embed the contents of a file as Data. The proposed syntax is…

@mklbtz
mklbtz / AbsoluteDirectory.rb
Last active October 13, 2017 15:46
A DSL for safely building file paths
class AbsoluteDirectory < AbstractPath
def self.root
AbsoluteDirectory.new(nodes: [])
end
def initialize(nodes:)
raise "Last node cannot be a file, got (#{nodes.last.class})" if nodes.last&.file?
if nodes.first&.root?
super(nodes: nodes)
elsif nodes.first&.current?