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