Skip to content

Instantly share code, notes, and snippets.

@laser
laser / cruncher.rb
Last active January 4, 2016 09:19
number cruncher
class NumberCruncher
def initialize(calculator)
@calculator = calculator
end
def crunch(array_of_numbers)
@reduction ||= array_of_numbers.each do |number|
@calculator.add number
end
@laser
laser / rails.rb
Created January 22, 2014 21:34
Real World Rails
# app/services/calculation_service.rb
class CalculationService
def initialize(repository)
@repository = repository
end
def calculate(operation, x, y)
result = StatelessCalculator.send operation, x, y
@repository.save_calculation operation, x, y, result
result
@laser
laser / multi_safe.rb
Created January 22, 2014 21:33
Multithread safe
def add_range_safe
threads = (1..256).each_slice(16).map do |range|
Thread.new do
Thread.current[:sum] = range.inject(0) do |memo, n|
StatelessCalculator.add memo, n
end
end
end
result = threads.map { |t| t.join[:sum] } .reduce(:+)
@laser
laser / multi_unsafe.rb
Created January 22, 2014 21:33
Multithread unsafe
def add_range_unsafe
c = StatefulCalculator.new
threads = (1..256).each_slice(16).map do |range|
Thread.new do
range.each { |n| c.add n }
end
end
threads.map(&:join)
@laser
laser / stateless_test_a.rb
Created January 22, 2014 21:32
Stateless Test
describe StatelessCalculator do
it 'should add some numbers' do
expect(StatelessCalculator.add(10, StatelessCalculator.add(5, 3))).to eq(18)
end
it 'should divide some numbers' do
expect(StatelessCalculator.div(10, 2)).to eq(5)
end
end
@laser
laser / statefultest_b.rb
Created January 22, 2014 21:32
Stateful Test B
describe StatefulCalculator do
before(:all) do
@subject = StatefulCalculator.new
end
it 'should add some numbers' do
expect(@subject.add(5).add(3).add(10).result).to eq(18)
end
it 'should divide some numbers' do
@laser
laser / statefultest_a.rb
Created January 22, 2014 21:31
Stateful Test A
describe StatefulCalculator do
before(:all) do
@subject = StatefulCalculator.new
end
it 'should add some numbers' do
expect(@subject.add(5).add(3).add(10).result).to eq(18)
end
end
@laser
laser / stateless.rb
Created January 22, 2014 21:30
Stateless Calculator
module StatelessCalculator
def add(x, y)
x + y
end
def div(num, denom)
num / denom
end
module_function :add, :div
@laser
laser / stateful.rb
Created January 22, 2014 21:30
Stateful Calculator
class StatefulCalculator
def initialize
@total = 0
end
def add(x)
@total += x
self
end
@laser
laser / pure.rb
Last active January 4, 2016 04:19
Pure Functions
# lambda is impure: mutates shared state (the fruits hash)
fruits = {}
hashify = lambda do |fruit|
fruits[fruit] = fruit
end
["apple", "pear"].each &hashify
# lambda is pure: operates only on its arguments
to_nv_pair = lambda do |fruit|
[fruit, fruit]