plumatic / schema

Clojure(Script) library for declarative data description and validation
Other
2.4k stars 256 forks source link

Idea: Different return schemas per arity #446

Open frenchy64 opened 2 years ago

frenchy64 commented 2 years ago

This was suggested to me by @DeLaGuardo.

It seems like there's an elegant extension of s/defn's syntax to support different return schemas per arity:

(s/defn foo
  (:- Return1 [])
  (:- Return2 [a]))

Transducer functions are a good motivation:

(s/defn map
  (:- Transducer [f] ...etc)
  (:- [A] [f & xs] ...etc))

There would need to be a restriction that disallows combining this syntax the original return syntax.

The question is, how to support this in FnSchema? FnSchema is hardcoded with a single return schema.

Idea: we could introduce a new container for a list of FnSchemas:

(->MultipleFnSchemas [(->FnSchema Return1 Inputs1), (->FnSchema Return2 Inputs2)])

Not sure how to extend the syntax of s/=>* to support this. Perhaps repeat the same idea at the syntax level?

(s/multiple-fn-schemas (s/=> Return1 Inputs1) (s/=> Return2 Inputs2))