-
-
Save hosh/e39d135862d5fc857757 to your computer and use it in GitHub Desktop.
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 |
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.
@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.
Yeah it has been my understanding (without having looked myself yet) that elixir is basically ruby but re-designed for FP first, so maybe that's what we should be dabbling with.
My personal taste has always preferred the english word rather than an operator (
or
instead of||
,and
instead of&&
,unless
rather thanif !()
, etc.) so maybe that's an option in this case, somehow, but the verb is elusive if we want to avoid stomping on pre-defined concepts like filtering, presenting, transforming, etc. Perhaps something along the lines ofpresents :price, taken_from attribute.(:price), via helper.(:number_to_currency)
I think it's harder to map many of the logical concepts of FP to english grammar, though, since like I was saying, it gets pretty terse and a lot of implicit knowledge about what complex functional concepts mean is required. Writing out an "english descriptive" version of each thing might turn into pretty lengthy prose and spoil half the fun.