runexec
I was toying around to see if I could possibly get something similar to Clojure-style pre/post enforcement. This is what I came up with and would like your input. Thanks.
Example Usage
defmodule Example do
require Contract
def reverse_abc(x) do
# Contract pre processing
pre_must_be_abc = fn -> x == "abc" end
pre = [
pre_must_be_abc,
]
# Contract post processing
post_must_be_cba = fn x -> x == "cba" end
post_must_be_string = fn x -> is_binary x end
post = [
post_must_be_cba,
post_must_be_string,
]
# Contract
# The arguments here are `[x]` and do not represent the current value of `x`
reverse_abc_contract = Contract.new([x], [pre: pre, post: post], String.reverse(x))
# Encorce Contract
reverse_abc_contract.(x)
end
end
Basic Implementation
defmodule Contract do
defmodule EnforcePreError do
defexception message: "Argument(s) Failed Pre Processing Requrements."
end
defmacro enforce(:pre, list, expr) do
quote do
valid? =
Enum.map(unquote(list), fn f -> f.() end)
|> Enum.all?(&(&1 == true))
case valid? do
true -> unquote(expr)
_ -> raise EnforcePreError
end
end
end
defmodule EnforcePostError do
defexception message: "Return value Failed Post Processing Requrements."
end
defmacro enforce(:post, list, value) do
quote do
valid? =
Enum.map(unquote(list), fn f -> f.(unquote(value)) end)
|> Enum.all?(&(&1 == true))
case valid? do
true -> unquote(value)
_ -> raise EnforcePostError
end
end
end
defmodule EnforceNothingError do
defexception message: "No enforcements are defined."
end
defmacro enforce(:prepost, pre, post, expr) do
quote do
pre = unquote(pre) || []
post = unquote(post) || []
no_enforcements? = (pre == [] && post == [])
get_value = fn ->
unquote(__MODULE__).enforce(:pre, unquote(pre), unquote(expr))
end
cond do
no_enforcements? -> raise EnforceNothingError
pre && post -> unquote(__MODULE__).enforce(:post, unquote(post), get_value.())
(pre == []) && post -> unquote(__MODULE__).enforce(:post, unquote(post), unquote(expr))
(post == []) && pre -> get_value.()
end
end
end
defmacro new(args, opts, expr) do
quote do
fn (unquote_splicing(args)) ->
unquote(__MODULE__).enforce(
:prepost, unquote(opts[:pre]), unquote(opts[:post]), unquote(expr)
)
end
end
end
end
Trending in Discussions
As the title says, please share what you’ve been up to with Elixir. Whether that’s been learning it, looking into it, making stuff with i...
New
I want to open this thread for you all to discuss and help those who really like Ash but are still hesitant to use it in a real project. ...
New
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
I’m posting this in response to Jose’s recent tweet (Cr. link) :
People are sleeping on Elixir for a coding harness:
Hot-code swappi...
New
Hello,
I wrote Stop My Hand, a Scattergories-like web application using Phoenix/LiveView as my learning project for Elixir (after readin...
New
It would be helpful to have a list of companies worldwide that hire engineers without prior experience in Elixir. Often, it can be quite ...
New
Anyone running long-lived stateful processes on BEAM? We’re building an AI agent runtime and would love to compare notes.
We’re a small ...
New
Other Trending Topics
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
There are three potential reasons for members of this forum to have a look at https://vutuv.de
You are tired or annoyed of LinkedIn.
Yo...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #ai
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming









