vic
Spec: like clojure.spec but for Elixir
Hello,
I’ve just pushed Spec, the first beta version of an clojure.spec inspired library for conforming data against an specification.
Currenly Spec supports conforming against most Elixir data types, supports regex operators, and some other niceties you can read of in the README file (a bit long read). But there still work to do on it, like supporting data example generators, and maybe other things.
<3, vic.
Most Liked
OvermindDL1
/me is glad he grabbed it before github went down…
This looks quite nice, could clean up my type testing that I have scattered around. I am curious though, why does something like:
conform!(is_tuple() and &(tuple_size(&1) == 2), {1})
Take the value as the second argument instead of the first? It would be convenient to do things like:
value
|> conform!(is_tuple() and &(tuple_size(&1) == 2))
|> etc...
Also, on this example from your README.md:
iex> conform!(hello :: is_binary(), "world")
{:hello, "world"}
Have you thought about mandating this syntax instead:
iex> conform!(:hello :: is_binary(), "world")
{:hello, "world"}
That way we could tag it with anything, even a variable like:
iex> blah = :vwoop
iex> conform!(blah :: is_binary(), "world")
{:vwoop, "world"}
Qqwy
vic
Hey @OvermindDL1, Thanks a lot for your feedback.
Well, while conform/2 expects the predicates (or any defined spec) inside of it to take the value as first argument (values are just piped into predicates), conform/2 itself expects its as second, I guess just because in Elixir functions use the first argument for the subject value, eg Regex.match(regex, string), so I guess I just went for Spec.conform(spec, value) naturally.
But if you do defspec and give it a name, then the resulting function will expect to work on the first value, applying the spec to it.
defp sum_tuple({a, b}, c) when a + b == c, do: true
defp sum_tuple({a, b}, c), do: false
defspec two_tuple(is_tuple() and &(tuple_size(&1) == 2))
value = {1, 2}
value
|> two_tuple()
|> sum_tuple(3)
So I guess having Spec.conform/2 take the spec as first argument (again just like many other things on Elixir) is better.
Regarding tags, you are irght, it could be useful to tag with a bound variable. Will change it and see how it feels.
Thanks for reading and giving input! ![]()
Last Post!
marciol
Awesome, I was waiting something like that since a presentation of clojure.spec in a clojure meetup. Nice to see your work. I pretend to use in my projects soon.
Popular in Announcing
Other popular topics
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
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









