- Identify =
lambda{|f, x| f.call(x) }
- Maybe =
lambda{|f, x|
mzero_method = x.respond_to?(:mzero?) ? :mzero? : :nil?
x.send(mzero_method) ? x : f.call(x)
}
- List =
lambda{|f, x| x.map(&f) }
- Reader =
lambda{|f, (r, x)|
Thread.current[:lambda_driver_reader_ctx_ask] = r
f.binding.eval(<<-CODE)
def ask
Thread.current[:lambda_driver_reader_ctx_ask]
end
CODE
begin
[r, f.call(x)]
ensure
Thread.current[:lambda_driver_reader_ctx_ask] = nil
f.binding.eval("undef ask")
end
}
- Writer =
lambda{|f, (x, w)|
pool = w || []
Thread.current[:lambda_driver_writer_ctx_pool] = pool
f.binding.eval(<<-CODE)
def tell(s)
pool = Thread.current[:lambda_driver_writer_ctx_pool]
pool << s
end
CODE
begin
[f.call(x), pool]
ensure
Thread.current[:lambda_driver_writer_ctx_pool] = nil
f.binding.eval("undef tell")
end
}