vervel is an experiment in creating a functional utility library for PHP modeled as much as possible after Clojure's core library. thus its goal is to mock as many of Clojure's standard functions through aliasing, reordering of arities, or writing an implementation of the function. vervel is not currently a library which intends to bring any new data types or drastically different functionality to PHP itself, so if you're looking for laziness, persistent data structures or concurrency, maybe check back in a decade or so...
use in production at your own risk!
As a general rule, functions will be identical to their name in Clojure except converted from kebab-case to snake_case and have their ? stripped (illegal character in PHP) unless that function name (after aforementioned conversion) already exists in PHP. Still figuring out a naming strategy that will be straightforward for that case. Consider the following:
The function empty in Clojure returns an empty colleciton or nil, while Clojure's empty? is used to check if a collection has no items. PHP already implements empty to check if an array is empty--and regardless, since PHP doesn't allow ?, we'd still have ended up with two identically named functions if we tried to implement both. Since modifying core functions is a no-no, a new version of Clojure's empty will require a different name. Suggestions for strategy here is welcome.
Also, some functions, such as array_map,array_reduce and array_filter have had their arities made consistent and the prefix array_ stripped (to reduce noise).
As previously mentioned, full support of Clojure's data types is not the end goal, so many core Clojure functions are not here. This is more a wishlist/to-do list of planned support. If you can make a good argument for a function I missed, I'll try to support it!
Supported - ✅
Planned Support - ⬜
Won't Support - ❌
| fn | support |
|---|---|
| not | ✅ |
| and | ❌ (unless namespace conflict can be resolved) |
| or | ❌ (unless namespace conflict can be resolved) |
| cond | ❌ (covered by switch case, more or less.) |
| fn | support |
|---|---|
| count | ❌ (exists in PHP) |
| empty | ❌ (unless namespace conflict can be resolved) |
| not-empty | ❌ (unless namespace conflict can be resolved) |
| into | ❌ (types not applicable) |
| conj | ✅ |
| cons | ✅ |
| contains? | ✅ (see contains) |
| distinct? | ⬜ |
| empty? | ❌ (exists in PHP) |
| every? | ✅ (see every) |
| not-every? | ✅ (see not_every) |
| some | ✅ |
| not-any? | ✅ (see not_any) |
| get | ✅ |
| assoc | ⬜ |
| dissoc | ⬜ |
| merge | ⬜ (will alias array_merge and make non-destructive) |
| merge-with | ⬜ |
| first | ✅ |
| last | ✅ |
| rest | ✅ |
| butlast | ✅ |
| map | ✅ |
| filter | ✅ |
| reduce | ✅ (note: arity of 'initial' arg preserved) |
| remove | ✅ |
| concat | ✅ |
| reverse | ✅ (alias of array_reverse) |
| interleave | ✅ (alias of implode, not lazy) |
| interpose | ✅ (not lazy) |
| zipmap | ⬜ (will alias array_combine) |
| frequencies | ⬜ (will alias array_count_values) |
| select-keys | ✅ (see select_keys) |
| keys | ⬜ (will alias array_keys) |
| vals | ⬜ (will alias array_values) |
| find | ⬜ (maybe, could be duplicative of get) |
| update-in | ⬜ |
| seq | ⬜ (could be useful for nil punning, maybe not) |
| rand-nth | ⬜ |
| second | ✅ |
| take | ⬜ (not lazy) |
| take-last | ⬜ (not lazy) |
| take-nth | ⬜ (not lazy) |
| take-while | ⬜ (not lazy) |
| drop | ⬜ (not lazy) |
| drop-last | ⬜ (not lazy) |
| drop-while | ⬜ (not lazy) |
| keep | ⬜ (not lazy) |
| keep-indexed | ⬜ (not lazy) |
| distinct | ⬜ (will alias array_unique, not lazy) |
| group-by | ⬜ |
| partition | ⬜ (not lazy) |
| partition-all | ⬜ (not lazy) |
| partition-by | ⬜ |
| split-at | ⬜ |
| split-with | ⬜ |
| replace | ⬜ |
| shuffle | ❌ (shuffle exists, may provide another version?) |
| reductions | ⬜ |
| mapcat | ✅ |
| max-key | ⬜ |
| min-key | ⬜ |
| fn | support |
|---|---|
| pos? | ⬜ |
| zero? | ⬜ |
| neg? | ⬜ |
| identical? | ⬜ (undecided) |
| nil? | ⬜ (could be equivalent to is_null) |
| even? | ✅ (see even) |
| odd? | ✅ (see odd) |
| max | ❌ (exists in PHP) |
| min | ❌ (exists in PHP) |
| quot | ✅ |
| rem | ⬜ |
| mod | (will alias % operator) |
| inc | ⬜ |
| dec | ⬜ |
| max | ❌ (exists in PHP) |
| min | ❌ (exists in PHP) |
| fn | support |
|---|---|
| complement | ✅ |
| comp | ✅ |
| juxt | ✅ |
| apply | ✅ (alias of call_user_func_array) |