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
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "rails"
gem "sqlite3"
gem "jbuilder"
gem "active_model_serializers"
@okuramasafumi
okuramasafumi / growrb-anti-harassment-policy.md
Last active October 31, 2021 12:41
Grow.rb/Entaku.rb/Rubygemsコードリーディング部のアンチハラスメントポリシーです。

アンチハラスメントポリシー

Grow.rb/Entaku.rb/Rubygemsコードリーディング部ではアンチハラスメントポリシーを定めています。

以下の内容について合意・遵守いただけない場合、イベントへの参加をお断りする・イベントからの退出をお願いする場合がございますので予めご了承ください。

当ポリシーの目的

当ポリシーは参加者の皆さんにイベントを最大限に楽しんでいただくために策定されました。

@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 / 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 / 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 / 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 / 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 / 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 / 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 / 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