selfrefactor / rambdax

Extended version of Rambda
https://selfrefactor.github.io/rambdax
MIT License
221 stars 26 forks source link

Suggestion for new methods #43

Closed selfrefactor closed 1 year ago

selfrefactor commented 4 years ago

This issue will be kept open to keep track of various suggestion for new Rambdax methods

selfrefactor commented 4 years ago

R.whereAny - https://github.com/ramda/ramda/pull/2925

selfrefactor commented 4 years ago

R.partition support objects

selfrefactor commented 4 years ago

R.pickBySchema

cjk commented 4 years ago

Often, the only reason I still have to use Ramda is because of R.chain. Array.flatMap is not 100%-replacement (and not pipe-able). Not sure why it was not included in Rambdax.

selfrefactor commented 4 years ago

@cjk Good suggestion. I will get back to you when I have a proposal for method's specification.

8bu commented 4 years ago

also by removing R.addIndex , I can't find any way to get index of current element when using R.find. I don't want to use R.indexOf in the callback of iteration.

selfrefactor commented 4 years ago

@8bu I see your valid point - I will restore R.addIndex but I may need 2 more weeks for that as I am in the middle of building the next version and I still have some things to complete.

I created separate issue for your suggestion - https://github.com/selfrefactor/rambdax/issues/51 and thank you for your input.

8bu commented 4 years ago

@8bu I see your valid point - I will restore R.addIndex but I may need 2 more weeks for that as I am in the middle of building the next version and I still have some things to complete.

I created separate issue for your suggestion - #51 and thank you for your input.

I just discussed with my friend, he said your R.find has added index as 2nd arg like R.findIndex but the docs hasn't updated yet. I did double check, R.find do have index as 2nd arg. But type & document haven't updated it. =>> So Typescript won't allow me to use 2nd arg if the type haven't updated. I will make a PR to update typescript type for those functions. For the docs I will leave it to you.

selfrefactor commented 4 years ago

wonderful, but you have to keep in mind that the PR should be for Rambda repo, not Rambdax, as not this repo serves only as output, while Rambda holds all the tests and the source of the methods. Still, if it is easier for you to create the PR for Rambdax, then please do so, I will make sure that your changes are applied correctly and the final result is as expected.

selfrefactor commented 4 years ago

@8bu I will close the issue for restore of R.addIndex and I will try to fix the typings of R.find to allow you to use the index argument.

8bu commented 4 years ago

@8bu I will close the issue for restore of R.addIndex and I will try to fix the typings of R.find to allow you to use the index argument.

Sorry I've been busy with works this month. I did submit a PR for the type problem but it's in this repo, so I close that already. You can take a look at that PR

selfrefactor commented 4 years ago

I saw the PR in question and I will try to implement its logic. I will keep you informed on the progress.

selfrefactor commented 4 years ago

I started implementing your suggestions. One thing to share is that R.adjust doesn't pass index to the function argument, as it doesn't iterate over the list.

selfrefactor commented 4 years ago

As for the rest of the changes - I just applied them to Rambda repo and will be published with the upcoming 5.9.0.

In Rambdax these changes will come with the upcoming 4.0.0 which should be ready in 2 weeks time.

selfrefactor commented 4 years ago

@cjk R.chain is added in Rambda and will be added to Rambdax with version 4.0.0.

https://github.com/selfrefactor/rambda#chain

cjk commented 4 years ago

@selfrefactor Fantastic news - that finally enables me to ship one less library with my various apps. Thanks a lot!

agriffis commented 2 years ago

@selfrefactor Do you still want requests in this issue, or somewhere else? I recently tried to switch to Rambdax and found I was missing juxt, unary, invoker, and a few others. I could get the longer list if you're interested.

selfrefactor commented 2 years ago

@agriffis Yes, I am still interested in adding more methods, so please share more of this list of missing methods.

agriffis commented 2 years ago

Here's the full list:

R.__
R.addIndex
R.construct
R.countBy
R.dissocPath
R.invoker
R.juxt
R.mergeRight
R.nthArg
R.pickBy
R.reduced
R.sortWith
R.unary
R.uniqBy
R.unnest

This is the result of grepping my project and then uniq -d with the list of missing methods from your README.

I didn't attempt to go through this and make sense of it yet. There might be some methods here that would be better handled by separate methods on Rambdax. For example addIndex isn't really that interesting in Rambdax. However unary becomes more interesting when passing to Rambdax map to avoid the extra function parameters when they're problematic (for example, parseInt)

I'm particularly fond of reduced. I wrote an implementation of it once that might apply:

class Reduced<T> extends Error {
  value: T
  constructor(value: T) {
    super()
    this.value = value
  }
}

const reduced = <T>(x: T) => new Reduced(x)

interface Reducer {
  <T, K>(items: T[], fn: (acc: K, item: T) => K | Reduced<K>, initial: K): K
  indexed: <T, K>(
    items: T[],
    fn: (acc: K, item: T, index: number, items: T[]) => K | Reduced<K>,
    initial: K,
  ) => K
}

const reduce: Reducer = (items, fn, initial) => {
  try {
    return R.reduce(
      items,
      (...args) => {
        const r = fn(...args)
        if (r instanceof Reduced) {
          throw r
        }
        return r
      },
      initial,
    )
  } catch (e) {
    if (e instanceof Reduced) {
      return e.value
    }
    throw e
  }
}