Skip to content

Instantly share code, notes, and snippets.

@hosh
Last active August 29, 2015 14:16
Show Gist options
  • Save hosh/e39d135862d5fc857757 to your computer and use it in GitHub Desktop.
Save hosh/e39d135862d5fc857757 to your computer and use it in GitHub Desktop.
A neat thing you can do with Intermodal + functional Ruby
require 'rlet/functional'
module SomeApi
module API
class V1_0 < Intermodal::API
using RLet::Functional
self.default_per_page = 25
map_data do
attribute = ->(field) { ->(r) { r.send(field) } }
helper = ->(_method) { ActionController::Base.helpers.method(_method) }
presentation_for :book do
presents :id
presents :price, with: attribute.(:price) | helper.(:number_to_currency)
end
end
end
end
end
@hosh
Copy link
Author

hosh commented Feb 25, 2015

I don't always like having English-like DSL for everything. Data transformation tends to be one of them.

presents :price, taken_from attribute.(:price), via helper.(:number_to_currency)

is just too wordy for what is essentially a data transformation. More importantly, it's not likely to be as flexible.

Elixir is a syntax that takes what made Ruby look good and built it on top of the Erlang BEAM VM. So it's functional in that sense, but Elixir's sweet spot is that it has better metaprogramming than Erlang itself while retaining what makes Erlang capable for the problems it solves well. Many of Elixir's basic syntax and sugar are actually Lisp-style macro expansions, so it's a bit different from Ruby-style metaprogramming.

@hosh
Copy link
Author

hosh commented Feb 25, 2015

@brandondees to expand further on what I mean by "flexible", the | is an applicative operator. That means you can chain functions along the lines of:

presents :price, with: attribute.(:price) | locale.(:fr) | helper.(:number_to_currency)

as an example.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment