Skip to content

Instantly share code, notes, and snippets.

View serradura's full-sized avatar
🎯
Focusing

Rodrigo Serradura serradura

🎯
Focusing
View GitHub Profile
@serradura
serradura / nano_case.rb
Last active March 30, 2023 12:36
NanoCase: Abstraction inspired by the u-case gem (compatible with old and new Rubies)
class NanoCase
class Result
UNDEFINED = :undefined
attr_reader :type, :data
def initialize(type, data)
@type = type
@data = data
end
@serradura
serradura / bench_01.rb
Created March 6, 2023 17:48
Benchmarks instance versus singleton methods
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'benchmark-ips', '~> 2.11'
end
class Calc
def initialize(a, b)
@serradura
serradura / 01_factory_collection_filter.rb
Created February 23, 2023 17:22
Abstractions to filter an array of hashes in Ruby
class FactoryCollectionFilter
def initialize(config)
@config = config || {}
end
def call(filters: {}, data: [])
return data if filters.empty?
filters.reduce(data) do |filtered, (filter, value)|
filter_fn = @config[filter]
@serradura
serradura / oop.rb
Last active February 10, 2023 14:18
Código produzido na live "A verdadeira Orientação a Objetos" em 09/02/2023
####################################
# Pilares da Orientação a Objetos: #
####################################
# 👍 Abstração. | >
# 👍 Encapsulamento | > > Composição 🙌
# 👍 Polimorfismo | >
# 👎 Herança
class AssemblyLine
CARS_PRODUCED_PER_HOUR = 221.0
def self.calculate_cars_per_hour(speed)
speed * CARS_PRODUCED_PER_HOUR
end
def self.calculate_success_rate(speed)
case speed
when 1..4 then 1
@serradura
serradura / mecha_basic.rb
Last active July 31, 2022 11:57
mecha.rb - a minimalist finite state machine implemented using Ruby 3.1 (basic = 34 LOC, enhanced = 53 LOC)
class Mecha
private attr_accessor(:states_map, :callbacks, :transitions, :current_state)
public :transitions, :current_state
def initialize(initial_state:, transitions:)
self.states_map = transitions.parameters.select { |(type, _)| type == :keyreq }.to_h { [_2, _2] }
self.callbacks = Hash.new { |hash, key| hash[key] = [] }
self.transitions = transitions.call(**states_map).transform_values(&:freeze).freeze
@serradura
serradura / pub_sub.rb
Created May 11, 2022 15:18
Implementação do pub/sub na mão equivalente a gem Wisper
module Susurro
def subscribe(handler)
subscribers << {name: nil, handler: handler}
self
end
def on(event_name, &handler)
subscribers << {name: event_name, handler: handler}
@serradura
serradura / dog_ceo_api.rb
Created May 2, 2022 17:10
Example of how to use the strategy pattern in Ruby to create a fake and a real API client
require 'uri'
require 'json'
require 'net/http'
# https://dog.ceo/dog-api/
class DogCeoAPI
class FakeStrategy
def get_random
{
"message" => "https://images.dog.ceo/breeds/terrier-welsh/lucy.jpg",
@serradura
serradura / kind_interface.rb
Created March 9, 2022 02:30
Kind::Interface prototype
module Kind
module Interface
module State
extend self
@current = :enabled
def disable!
@current = :disabled
end
@serradura
serradura / get_tax.rb
Last active February 8, 2022 02:46
Using dependency injection to improve testability
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'rspec', '~> 3.10'
gem 'activesupport', require: 'active_support/all'
end
module Calc