Skip to content

Instantly share code, notes, and snippets.

View mklbtz's full-sized avatar

Michael Bates mklbtz

View GitHub Profile
@mklbtz
mklbtz / Array+partition.swift
Last active September 2, 2017 21:00
New array method: partition
// Here, I’ve added a function to Array called `partition`.
// In short, the function will partition the Array into a Dictionary based on a function
// which takes an Element of the Array and returns its corresponding Key into the Dictionary.
extension Array {
func partition<Key>(key: (Element)->Key) -> [Key: [Element]] {
var groups = [Key: [Element]]()
for element in self {
let key = key(element)
var group = groups[key] ?? [Element]()
@mklbtz
mklbtz / circles.py
Created July 4, 2015 21:54
circle-finder.py
# The MIT License (MIT)
#
# Copyright (c) 2015 Michael Bates
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# O(nk)
class Array
def unzip ary
return [] if ary.empty?
count = ary.first.count
(0...count).map { |i|
ary.map { |tuple|
raise 'inconsistent tuple size' if tuple.count != count
tuple[i]
}
@mklbtz
mklbtz / option_set.rb
Last active May 1, 2017 15:37
Porting Apple's OptionSets to Ruby
require 'active_support'
module OptionSet
extend ActiveSupport::Concern
included do
attr_reader :value
include Comparable
include Enumerable
@mklbtz
mklbtz / auto_rake.rb
Last active February 22, 2017 16:43
Extend a module with AutoRake for convenient rake task calling.
module AutoRake
require 'rake'
Rails.application.load_tasks if Rake::Task.tasks.empty?
def const_missing(const)
mod = Module.new
mod.extend AutoRake
const_set(const, mod)
end
@mklbtz
mklbtz / OpenSource.rb
Last active April 16, 2017 22:46
A method for opening the `source_location` of a method or proc in your preferred editor
# A method for opening the `source_location`
# of a method or proc in your preferred editor.
# Depends on the presence of $EDITOR in your environment.
module OpenSource
def open_source
return false unless
loc = source_location and
loc.first != '(irb)'
path = loc.join(':') # append the line number to the file path.
system("eval \"$EDITOR #{path}\"")
@mklbtz
mklbtz / method_reflection.rb
Last active April 12, 2017 20:03
Helper methods for inspecting your methods
class Object
# List Methods defined directly in the receiver's class.
def my_methods
methods_from(self.class)
end
# List Methods with names matching the regex.
def methods_matching(regex)
methods_where { |meth| regex.match(meth.name.to_s) }
end
@mklbtz
mklbtz / algebra.rb
Last active September 2, 2017 20:57
Ruby Enums plus example
# A Numeric-like class that can represent algebraic expressions.
# Uses typecases to define what operations are representable.
class Algebra
include Enum
# Represents number literals
typecase :scalar, value: Numeric do
def to_s
value.to_s
end
@mklbtz
mklbtz / Algebra.swift
Last active September 3, 2017 19:38
A Number-like type that can represent algebraic expressions
// A Number-like type that can represent algebraic expressions.
public enum Algebra {
case scalar(Double)
case variable(name: String, () -> Double)
indirect case add(Algebra, Algebra)
indirect case subtract(Algebra, Algebra)
indirect case multiply(Algebra, by: Algebra)
indirect case divide(Algebra, by: Algebra)
indirect case magnitude(Algebra)
indirect case raise(Algebra, toPower: Int)
@mklbtz
mklbtz / Identifier.swift
Created September 2, 2017 21:52
A type-safe String identifier for objects
/// Useful as a type-safe String identifier for objects, records, etc.
/// Generic type A is the type of the object being "identified".
public struct Identifier<A>: Equatable, Hashable, Comparable {
public let string: String
public init(_ string: String) {
self.string = string
}
public var hashValue: Int {