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.
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 dodefspec 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.
I will definitely use this when writing more elaborate behaviours/interfaces. It looks like a really clean way to structure conformity checks. Thank you for making this, @vic!
Today I made some progress on the README guide, it’d would be wonderful if any of you could give a quick look at it and provide some feedback, thanks in advance!
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.