Fiat Pax
Fiat Pax

Reputation: 417

Function composition early return

I am composing a series of function but I wonder what's the best way to achieve what I want first this is how I compose:

const composeP = (...fns) => fns.reduce((f, g) => async (...args) => f(await g(...args)))

const profileSummary = profileData => composeP(createProfileSummary, getMKAProfile)(profileData)

now what I want is to do a check and if profileData which is my input is a certain string e.g. "cantbesearched" I want to return a value immediately to "profileSummary" variable instead of executing previous functions...

so is it possible to create a "filterWords" function, put it in front of the composition like this:

const profileSummary = profileData => composeP(createProfileSummary, getMKAProfile, filterWords)(profileData)

and if certain words are detected, skip previous functions on the left then return a value.

Upvotes: 0

Views: 253

Answers (1)

Bergi
Bergi

Reputation: 664217

Is it possible to create a "filterWords" function to be put it in front of the composition?

No. What you want to do is branching, which is not possible with function composition.

What you can do is compose functions that work on a type which provides an error path, like Maybe or Either. (You can also consider exceptions as a builtin error path for every type, so just throw).
Oh wait, you already are doing that! You didn't write a plain function composition compose, you wrote composeP which uses monadic Kleisli composition - and promises do have such an error path:

function filterWords(word) {
    return word == "cantbesearched"
      ? Promise.reject(new Error("filtered for your safety"))
      : Promise.resolve(word);
}

Upvotes: 1

Related Questions