Skip to content

Instantly share code, notes, and snippets.

View havenwood's full-sized avatar
:octocat:

Shannon Skipper havenwood

:octocat:
View GitHub Profile
@havenwood
havenwood / install-ruby-3.4.0-mmtk.sh
Last active December 24, 2024 09:50
A little script to install Ruby 3.4.0 with the experimental MMTk garbage collector
#!/usr/bin/env zsh
version=3.4.0
brew install gmp jemalloc libffi libyaml openssl@3 readline zlib
command -v rustc >/dev/null 2>&1 || brew install rust
mkdir -p "$HOME/src"
cd "$HOME/src"
curl "https://cache.ruby-lang.org/pub/ruby/3.4/ruby-$version.tar.xz" | tar -x
cd "ruby-$version"
@havenwood
havenwood / integer.rb
Created December 2, 2024 16:52
A Ruby implementation of Integer#each_digit
class Integer
def each_digit(base = 10, &block)
raise Math::DomainError, 'out of domain' if negative?
raise TypeError, "wrong argument type #{base.class} (expected Integer)" unless base.respond_to?(:to_int)
radix = base.to_int
raise ArgumentError, 'negative radix' if radix.negative?
raise ArgumentError, "invalid radix #{radix}" if radix < 2
return enum_for(__method__, base) unless block_given?
@havenwood
havenwood / str.rb
Created November 13, 2024 21:55
Example for @isene on #ruby IRC
without = %w[b c]
without_regexp = Regexp.union(without)
split_index = 7
dropped = split_index.pred
str = 'abcdaba123abcd'
pos = str
.each_grapheme_cluster
.with_index
.lazy
@havenwood
havenwood / waffle.rb
Created November 8, 2024 16:01
An example of implementing #to_json for Ruby IRC
require 'json'
class Waffle
def initialize(toppings:, syrup:)
@toppings = toppings
@syrup = syrup
end
class << self
def json_create(object)
@havenwood
havenwood / enumerator.rb
Created September 28, 2024 09:54
Enumerator#feed examples
class Integer
def stream(by: 1)
Enumerator.new Float::INFINITY do |yielder|
int = self
loop do
fed = yielder.yield(int)
int += fed if fed
int += by
end
@havenwood
havenwood / immutable.rb
Created July 1, 2024 18:46
An example immutable (Dry) and mutable (Active Model) Args interface
require 'dry-struct'
require 'dry-types'
require 'dry-validation'
class WordTally
class Args < Dry::Struct
module Types
include Dry.Types()
end
@havenwood
havenwood / caesar.rb
Last active June 23, 2024 23:21
A Caesar cipher example in Ruby
class Caesar
def initialize(rot: 13, lower: [*'a'..'z'], upper: [*'A'..'Z'])
@rot = rot
@book = book(lower:, upper:)
end
def cipher(message) = message.gsub(/[a-zA-Z]/, @book)
alias_method :call, :cipher
private
@havenwood
havenwood / which.rb
Last active October 24, 2024 19:12
A `which` command for Ruby
# frozen_string_literal: true
require 'fileutils'
module FileUtils
# Returns the full path to an executable command if it exists in the PATH.
#
# FileUtils.which('ruby') # => "/usr/bin/ruby"
# FileUtils.which('matz') # => nil
#
@havenwood
havenwood / uuid_v7.rb
Last active June 17, 2024 21:33
UUIDv7 in Ruby, using IO::Buffer
def uuid_v7
milliseconds = Process.clock_gettime(Process::CLOCK_REALTIME, :millisecond)
buffer = IO::Buffer.new(16)
buffer.set_string([milliseconds].pack('Q>')[2..], 0)
buffer.set_string(SecureRandom.bytes(10), 6)
buffer.set_value(:U8, 6, buffer.get_value(:U8, 6) & 0x0F | 0x70)
buffer.set_value(:U8, 8, buffer.get_value(:U8, 8) & 0x3F | 0x80)
buffer.get_string.unpack('H8H4H4H4H12').join('-')
end
@havenwood
havenwood / nano_id.rb
Created June 16, 2024 22:54
A simple Nano ID implementation in Ruby
# frozen_string_literal: true
require 'securerandom'
module NanoID
ALPHABET = [*'A'..'Z', *'a'..'z', *'0'..'9', '_', '-'].freeze
module_function
def nano_id(alphabet: ALPHABET, size: 21)