module Catena::Lang
Public Class Methods
callback_to_func_name(callback_name)
click to toggle source
Helper functions
# File lib/catena/lang.rb, line 28 def self.callback_to_func_name(callback_name) # strip the "__" callback_name[2..-1] end
func_name_to_callback(func_name)
click to toggle source
# File lib/catena/lang.rb, line 33 def self.func_name_to_callback(func_name) "__#{func_name}" end
included(base_mod)
click to toggle source
we add the class methods to the base class so they don't have to.
# File lib/catena/lang.rb, line 8 def self.included(base_mod) base_mod.extend ClassMethods end
Public Instance Methods
__map2_a(bind_efx, efx_b, val_a, evaluator)
click to toggle source
# File lib/catena/lang.rb, line 101 def __map2_a(bind_efx, efx_b, val_a, evaluator) new_efx = pass(efx_b) >= and_then(bind(:map2_b, bind_efx, val_a)) evaluator.call(new_efx) end
__map2_b(bind_efx, val_a, val_b, evaluator)
click to toggle source
# File lib/catena/lang.rb, line 108 def __map2_b(bind_efx, val_a, val_b, evaluator) # update binding to have val_a and val_b as arguments func_name = Lang.callback_to_func_name(bind_efx["callback_name"]) args = bind_efx["callback_args"] + [val_a, val_b] new_efx = bind(func_name, *args) evaluator.call(new_efx) end
and_then(bind_efx, efx_a)
click to toggle source
# File lib/catena/lang.rb, line 66 def and_then(bind_efx, efx_a) binding_callback = bind_efx.is_a?(Symbol) ? bind(bind_efx) : bind_efx raise "bind_efx needs to be a binding" if binding_callback["type"] != "binding" { "type" => "and_then", "side_effect" => efx_a, "binding_callback" => binding_callback, } end
bind(*args)
click to toggle source
bind(callback_name, arg1, arg2, …)
# File lib/catena/lang.rb, line 54 def bind(*args) raise "Need at least callback_name" if args.length < 1 func_name = args[0] func_args = args[1..-1] || [] { "type" => "binding", "callback_name" => Lang.func_name_to_callback(func_name), "callback_args" => func_args, "cancel" => nil, } end
failure(error)
click to toggle source
# File lib/catena/lang.rb, line 46 def failure(error) { "type" => "failure", "error" => error } end
map2(bind_efx, efx_b, efx_a)
click to toggle source
# File lib/catena/lang.rb, line 92 def map2(bind_efx, efx_b, efx_a) binding_callback = bind_efx.is_a?(Symbol) ? bind(bind_efx) : bind_efx raise "bind_efx needs to be a binding" if binding_callback["type"] != "binding" pass(efx_a) >= and_then(bind(:map2_a, binding_callback, efx_b)) end
on_error(bind_efx, efx_a)
click to toggle source
# File lib/catena/lang.rb, line 77 def on_error(bind_efx, efx_a) binding_callback = bind_efx.is_a?(Symbol) ? bind(bind_efx) : bind_efx raise "bind_efx needs to be a binding" if binding_callback["type"] != "binding" { "type" => "on_error", "side_effect" => efx_a, "binding_callback" => binding_callback, } end
pmap(callback_name, efxs)
click to toggle source
# File lib/catena/lang.rb, line 124 def pmap(callback_name, efxs) { "type" => "pmap", "side_effects" => efxs, "serialized_callback" => "__#{callback_name}", } end
smap(bind_efx, efxs)
click to toggle source
# File lib/catena/lang.rb, line 117 def smap(bind_efx, efxs) self.send("map#{efxs.length}", bind_efx, *efxs.reverse) end
succeed(value)
click to toggle source
basic tasks and their composition that return task nodes
# File lib/catena/lang.rb, line 39 def succeed(value) { "type" => "succeed", "value" => value } end