You could do something like this:

def filter(query, filter, field, value) do
    if (filter == FilterTypes.c_GREATER_THAN),  do: greater_than(query, 
field, value)
    if (filter == FilterType.c_LESS_THAN), do: less_than(query, field, 
value)
# etc. etc.
  end

I'm not sure that's a vastly superior alternative but I think it would work.

--
Onorio


On Sunday, May 22, 2016 at 9:54:24 AM UTC-4, Nytz12 wrote:
>
> I see, not too fond of how much boilerplate is required for each constant, 
> but perhpas this is the only way to get them in guards?
>
> On Sunday, May 22, 2016 at 12:35:24 PM UTC+2, max s wrote:
>>
>> Hi,
>>
>> I use macros for such requirement in my own code:
>>
>> defmodule Constants do
>>   defmacro val1 do
>>     quote do
>>       "val1"
>>     end
>>   end
>>
>>   defmacro val2 do
>>     quote do
>>       "val2"
>>     end
>>   endend
>>
>>
>> And here's how it's used:
>>
>>
>> defmodule Test do
>>   require Constants
>>   
>>   def match v do    case v do
>>       Constants.val1 -> "matched val1"
>>       Constants.val2 -> "matched val2"
>>       _ -> "no match"
>>     end
>>   endend
>>
>>
>> Max
>>
>>
>> On 22 May 2016 at 12:16, Nytz12 <[email protected]> wrote:
>>
>>> Hi
>>>
>>> I use the following pattern to define cross module constants
>>>
>>> defmodule Visitor do
>>>
>>>   defmodule FilterTypes do
>>>     def c_GREATER_THAN, do: "greater_than"
>>>     def c_LESS_THAN,    do: "less_than"
>>>     def c_IS,           do: "is"
>>>     def c_IS_NOT,       do: "is_not"
>>>   end
>>>   ...
>>>
>>> Which lets me do something like this from other modules
>>>
>>> Visitor.FilterTypes.c_GREATER_THAN # == "greater than"
>>>
>>> Problem is that I just discored that these 'constants', which are really 
>>> function calls, cannot be used to do pattern match like:
>>>
>>> def filter(query, filter, field, value) do
>>>     case filter do
>>>       FilterTypes.c_GREATER_THAN -> greater_than(query, field, value)
>>>       FilterTypes.c_LESS_THAN    -> less_than(query, field, value)
>>>       FilterTypes.c_IS           -> is(query, field, value)
>>>       FilterTypes.c_IS_NOT       -> is_not(query, field, value)
>>>       _                          -> {:error, "unknown filter", filter}
>>>     end
>>>   end
>>>
>>> Is there a better approach i'm missing?
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "elixir-lang-talk" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to [email protected].
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/elixir-lang-talk/ace6b869-dfce-4d3f-aeeb-2d9bc4583f03%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/elixir-lang-talk/ace6b869-dfce-4d3f-aeeb-2d9bc4583f03%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-talk/6dd25b23-30d4-4f04-b3ef-6cad331a4489%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to