Here are commons ways to reuse logic in Elixir:
1a. Move Function to other module (guards, pattern-matching) 1b. Protocol - Polymorphism
- Behaviour Dynamic-func - with def method_name(implemetation, args)
| # See: http://www.nasdaqtrader.com/content/technicalsupport/specifications/tradingproducts/ouch4.2.pdf | |
| # See: https://hexdocs.pm/elixir/Kernel.SpecialForms.html#%3C%3C%3E%3E/1-modifiers | |
| # See: https://hexdocs.pm/elixir/Kernel.SpecialForms.html#%3C%3C%3E%3E/1-options | |
| alias Decimal, as: D | |
| symbol = "BTC_IDR" | |
| shares = 5000 | |
| price = "1.3" | |
| # Encode | |
| p = D.new(price) |> D.round(4) |> D.mult(10000) |> D.to_integer() | |
| message = <<shares::big-integer-4*8, String.pad_trailing(symbol, 8)::binary-8, p::big-integer-32>> | |
| # Decode | |
| <<shares2::big-integer-size(4)-unit(8), symbol2::binary-8, p2::big-integer-32>> = message | |
| {:ok, p2} = D.cast(p2) | |
| price2 = p2 |> D.div(10000) |> D.to_string() | |
| {shares2, symbol2, price2} | |
| # Pattern-match | |
| <<coinSymbol::binary-size(s), "_IDR" >> = symbol2 |
| defprotocol Ouch42Binary do | |
| @doc "Serialize " | |
| def marshal?(struct) | |
| def unmarshal?(binary) | |
| end |