38 lines
900 B
Ruby
38 lines
900 B
Ruby
# 20220720 Ruby programming solution
|
|
class Writer
|
|
attr_reader :value, :log
|
|
|
|
def initialize(value, log = "New")
|
|
@value = value
|
|
if value.is_a? Proc
|
|
@log = log
|
|
else
|
|
@log = log + ": " + @value.to_s
|
|
end
|
|
end
|
|
|
|
def self.unit(value, log)
|
|
Writer.new(value, log)
|
|
end
|
|
|
|
def bind(mwriter)
|
|
new_value = mwriter.value.call(@value)
|
|
new_log = @log + "\n" + mwriter.log
|
|
self.class.new(new_value, new_log)
|
|
end
|
|
end
|
|
|
|
lam_sqrt = ->(number) { Math.sqrt(number) }
|
|
lam_add_one = ->(number) { number + 1 }
|
|
lam_half = ->(number) { number / 2.0 }
|
|
|
|
sqrt = Writer.unit( lam_sqrt, "Took square root")
|
|
add_one = Writer.unit( lam_add_one, "Added one")
|
|
half = Writer.unit( lam_half, "Divided by 2")
|
|
|
|
m1 = Writer.unit(5, "Initial value")
|
|
m2 = m1.bind(sqrt).bind(add_one).bind(half)
|
|
|
|
puts "The final value is #{m2.value}\n\n"
|
|
puts "This value was derived as follows:"
|
|
puts m2.log
|