Skip to content

Instantly share code, notes, and snippets.

View okuramasafumi's full-sized avatar
:octocat:
Hire me!

OKURA Masafumi okuramasafumi

:octocat:
Hire me!
View GitHub Profile
@okuramasafumi
okuramasafumi / main.rb
Created May 30, 2023 08:32
RSpec documentation without executing
require 'syntax_tree'
class RSpecEnvironment
def initialize
@contexts = []
@results = []
end
def klass(k)
@contexts << k
@okuramasafumi
okuramasafumi / string_scanner.rb
Created May 27, 2023 16:33
Pure Ruby implementation of StringScanner
class MyStringScanner
class ScanError < StandardError; end
attr_reader :string, :captures
attr_accessor :pos
def initialize(string, _obsolete = false, fixed_anchor: false)
@string = string
@fixed_anchor = fixed_anchor
@pos = 0
@previous_pos = 0
@okuramasafumi
okuramasafumi / included.rb
Created April 17, 2023 13:27
Tell me if this module is included by the same class more than once
def self.included(base)
base.instance_variable_set(:@count, 0) unless base.instance_variable_defined?(:@count)
base.instance_variable_set(:@count, base.instance_variable_get(:@count) + 1)
puts base.name if base.instance_variable_get(:@count) > 1
end
@okuramasafumi
okuramasafumi / hash.rb
Last active April 2, 2023 11:56
[Proposal] Hash#transform in Ruby
class Hash
def transform(&block)
new_hash = {}
each_pair do |key, value|
rtn = block.call(key, value)
case rtn
in nil | true then new_hash[key] = value
in false then next
in Array[[_, _], *]
rtn.each do |k, v|
@okuramasafumi
okuramasafumi / hash_vs_case.rb
Created August 11, 2022 10:01
Performance comparison between hash lookup and case lookup
MAPPING = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5,
f: 6,
}.freeze
def method1(key)
@okuramasafumi
okuramasafumi / ice.rb
Created March 26, 2022 15:54
Ice feature from zinit in Ruby
module Kernel
def ice(key, value, on: Object)
if on.instance_methods.include?(key.to_sym)
prev = on.instance_method(key)
on.define_method key do
on.remove_method key
on.define_method(key, prev)
return value
end
else
@okuramasafumi
okuramasafumi / define_mixable_method.rb
Created March 25, 2022 16:16
Mixable method where we can sort method call sequence
class Module
def define_mixable_method(name:, calls:, main:)
define_method(name) do |&block|
method_candidates = calls.map {|name| method(name) }
block.call(main, method_candidates).each do |m|
m.call
end
end
end
end
@okuramasafumi
okuramasafumi / each_with_effect.rb
Created March 22, 2022 13:42
EachWithEffect module for Ruby
module EachWithEffect
DEFAULT = Object.new.freeze
def each_with_effect(effect_handlers = {}, &block)
effect = catch(:effect) do
block.call(self.peek)
end
if effect
handler = effect_handlers.find{ |k, v| k === effect }&.last || effect_handlers.fetch(DEFAULT)
alternative = handler.call(effect) if handler
@okuramasafumi
okuramasafumi / test.rb
Created March 19, 2022 14:17
Algebraic Effects with Ruby
class WithEffect
def initialize
@list = ["Foo", "Bar", 42, "Baz"]
end
def process_item(item)
throw(:item_not_string, 42) unless item.is_a?(String)
puts item
end
@okuramasafumi
okuramasafumi / fzf-git.zsh
Last active January 18, 2024 14:32 — forked from junegunn/functions.sh
Key bindings for git with fzf (https://junegunn.kr/2016/07/fzf-git/)
# GIT heart FZF
# -------------
is_in_git_repo() {
git rev-parse HEAD > /dev/null 2>&1
}
fzf-down() {
fzf --height 50% --min-height 20 --border --bind ctrl-/:toggle-preview "$@"
}