README
@client-directives/ramda
Subset of Ramda for use in graphql.
Peer Dependencies
ramda
graphql
@client-directives/core
Installation
npm i @client-directives/ramda
Supported functions:
For the most part most ramda functions of the form (a) => (b) => c have been converted to the form @function(value: a) which will then receive (b) the field value returned then call the function. If a function requires multiple parameters for setup tried to choose appropriate naming conventions.
Name | Example Usage | status |
---|---|---|
add | @add(value: 5) | ✔ |
assoc | @assoc(key: "key", value: "value") | ✔ |
assocPath | @assocPath(path: ["path","to", "field"], value: "value") | ✔ |
clamp | @clamp(value: [1, 10]) | ✔ |
concat | @concat(value: [2, 3, 4]) | ✔ |
contains | @contains(value: [2, 3, 4]) | ✔ |
countBy | @R(countBy: "toUpper") | |
dec | @dec | ✔ |
defaultTo | @defaultTo(value: 5) | x |
difference | @difference(value: [2, 3, 4]) | ✔ |
dissoc | @dissoc(value: "b") | ✔ |
dissocPath | @dissocPath(value: ["a", "b", "c"]) | ✔ |
divide (i) | @divide(value: 5) | ✔ |
drop | @drop(value: 2) | ✔ |
dropLast | @dropLast(value: 3) | ✔ |
dropRepeats | @dropRepeats | ✔ |
empty | @empty | ✔ |
endsWith | @endsWith(value: "a") | ✔ |
equals | @equals(value: { a: "foo" }) | ✔ |
F | @F | ✔ |
fromPairs | @fromPairs | ✔ |
gt | @gt(value: 2) | ✔ |
gte | @gte(value: 3) | ✔ |
has | @has(value: "name") | ✔ |
hasPath | @hasPath(value: ["user", "firstName"]) | ✔ |
head | @head | ✔ |
identical | @identical(value: 5) | ✔ |
identity | @identity) | x |
inc | @inc | ✔ |
includes | @includes(value: 3) | ✔ |
indexBy | @indexBy(value: "id") | ✔ |
indexOf | @indexOf(value: 3) | ✔ |
init | @init | ✔ |
insert | @insert(at: 3, value: 'x') | ✔ |
insertAll | @insertAll(at: 3, value: [1, 2, 3]) | ✔ |
intersection | @intersection(value: [1, 3, 4, 5]) | ✔ |
intersperce | @intersperce(value: 'a') | ✔ |
invert | @invert | ✔ |
invertObj | @invertObj | ✔ |
isEmpty | @isEmpty | ✔ |
isNil | @isNil | |
join | @join(value: ' ') | ✔ |
keys | @keys | ✔ |
last | @last | ✔ |
lastIndexOf | @lastIndexOf | ✔ |
length | @length | ✔ |
lt | @lt(value: 3) | ✔ |
lte | @lte(value: 3) | ✔ |
mathMod (ii) | @mathMod(value: 5) | ✔ |
max | @max(value: 10) | ✔ |
mean | @mean | ✔ |
median | @median | ✔ |
min | @min(value: 5) | ✔ |
modulo | @modulo(value: 7) | |
move | @move(from: 2, to: 5) | ✔ |
multiply | @multiply(value: 2) | ✔ |
negate | @negate | ✔ |
not | @not | ✔ |
nth | @nth(value: 4) | ✔ |
omit | @omit(value: ["a", "foo"]) | ✔ |
pair | @pair(value: "first") | ✔ |
path | @path(value: ["a", "b", "c"]) | ✔ |
pathOr | @pathOr(or: "foo", ["a", "b", "c"]) | ✔ |
pick | @pick(value: ["foo", "bar"]) | ✔ |
pickAll | @pickAll(value: ["foo", "bar"]) | |
prepend | @prepend(value: "foo") | ✔ |
product | @product | ✔ |
project | @project(value: ["first", "last"]) | ✔ |
prop | @prop(value: "foo") | ✔ |
propOr | @propOr(or: "foo", value: "bar") | ✔ |
props | @props(value: ["first", "last"]) | ✔ |
range | @range(value: 5) | ✔ |
remove | @remove(start: 1, count: 3) | ✔ |
repeat | @repeat(value: "hi") | ✔ |
reverse | @reverse | ✔ |
slice | @slice(from: 2, to: 5) | ✔ |
split | @slice(value: "/") | ✔ |
splitAt | @splitAt(value: 3) | ✔ |
splitEvery | @splitEvery(value: 3) | ✔ |
startsWith | @startsWith(value: "a") | ✔ |
subtract | @subtract(value: 2) | ✔ |
sum | @sum | ✔ |
symmetricDifference | @symmetricDifference(value: [1, 3, 4]) | |
T | @T | ✔ |
tail | @tail | ✔ |
take | @take(value: 2) | ✔ |
takeLast | @takeLast(value: 5) | ✔ |
toLower | @toLower | ✔ |
toPairs | @toPairs | ✔ |
toString | @toString | ✔ |
toUpper | @toUpper | ✔ |
trim | @trim | ✔ |
type | @type | ✔ |
union | @union(value: [1, 3, 4]) | |
uniq | @uniq | ✔ |
update | @update(at: 2, value: "foo") | ✔ |
values | @values | ✔ |
whereEq | @whereEq(value: { foo: "bar" }) | |
without | @without(value: [1, 2]) | ✔ |
xprod | @xprod(value: [1, 3]) | |
zip | @zip(value: ["a", "b", "c"]) | |
zipObj | @zip(value: ["a", "b", "c" ]) |
- ✔ indicates finished with tests
- x indicates some issue ran into.
- rest are undecided on api or if neccessary (or TODO).
(i) Ramda divide is (numerator, denominator) => value, this is strictly @divide(value: denominator) (ii) Ramda mathMod is (number, mod) => value, this is @mathMod(modulo)
What about Pipe/Compose?
@client-directives automatically pipe directives left to right. Also directives are applied depth first.
TODO:
- Finish implementation for all outlined functions
- Implement functions that take a callback (map, filter,...) as (fn) => ({ props }) => value => ramdaFn(fn, ...props, value) so they can be initialized.
- Implement common patterns for functions that take a callback as "extra" functions.
- Revisit API and signatures for 2nd release after use.