new Either(value){Either}
| Name | Type | Description |
|---|---|---|
value |
* | Value to wrap. |
Returns:
| Type | Description |
|---|---|
| Either | Either wrapped value. |
Examples
Via new
const v1 = new Right(value);
const v2 = new Left(otherValue);
Via function
const v3 = Right.from(value);
const v4 = Left.from(otherValue);
Via Either function
const fs = require("fs");
const Either = require("lodash-fantasy/data/Either");
function readFileSyncSafe(filePath, options) {
let result = null;
try {
result = Either.Right.from(fs.readFileSync(filePath, options));
} catch (error) {
result = Either.Left.from(error);
}
return result;
}
module.exports = getValue;
Members
-
staticEither.all
-
Returns a
Eitherthat resolves all of the eithers in the collection into a single Either.Example
const e1 = fs.readFileSync(filePath1); // => Right(contents1) const e2 = fs.readFileSync(filePath2); // => Right(contents2) const e3 = fs.readFileSync(filePath3); // => Left(error3) const e4 = fs.readFileSync(filePath4); // => Left(error4) Either.all([e1, e2]); // => Right([contents1, contents2]) Either.all([e1, e2, e3]); // => Left(error3) Either.all([e1, e2, e3, e4]); // => Left(error3) -
staticEither.any
-
Example
const e1 = fs.readFileSync(filePath1); // => Right(contents1) const e2 = fs.readFileSync(filePath2); // => Right(contents2) const e3 = fs.readFileSync(filePath3); // => Left(error3) const e4 = fs.readFileSync(filePath4); // => Left(error4) Either.any([e1, e2]); // => Right(contents1) Either.any([e2, e3]); // => Right(contents2) Either.any([e3, e4]); // => Left(error3) -
staticEither.each
-
Iterates over a collection of eithers and invokes the
iterateefor eachEither. Theiterateeis invoked with one argument:(value). Iteratee functions may exit iteration early by explicitly returning aLeft.Example
const optionalValues = [ getValue(path1, source), // => Right(value1) getValue(path2, source), // => Right(value2) getValue(path3, source), // => Left() getValue(path4, source) // => Left() ]; Either.each(eitherValue => eitherValue.ifRight(console.log), optionalValues); // => Right(value1) // => Right(value2) -
staticEither.equals
-
Determines whether or not the
otheris equal in value to the current (this). This is not a reference check.Examples
Reflexivity
Either.equals(v1, v1) === true; // => trueSymmetry
Either(v1, v2) === Either.equals(v2, v1); // => trueTransitivity
(Either.equals(v1, v2) === Either.equals(v2, v3)) && Either.equals(v1, v3) // => true -
staticEither.filter
-
Iterates over a collection of values, returning an array of all values the
predicatefor which returns truthy. Thepredicateis invoked with one argument:(value).Example
Filter and log failures
const optionalValues = [ getValue(path1, config), // => Right(value1) getValue(path2, config), // => Right(value2) getValue(path3, config), // => Left() getValue(path4, config) // => Left() ]; Either.filter(Either.isRight, optionalValues); // => [Right(value1), Right(value2)] -
staticEither.from
-
Creates a new
Eitherfrom avalue. If thevalueis already aEitherinstance, thevalueis returned unchanged. Otherwise, a newRightis made with thevalue. -
staticEither.isEither
-
Determines whether or not the value is a
Either.Example
isEither(); // => false isEither(Right.from()); // => true isEither(Left.from(error)); // => true -
staticEither.isLeft
-
Determines whether or not the value is a
Left.Example
isLeft(); // => false isLeft(Left.from(error)); // => true isLeft(Right.from()); // => false -
staticEither.isRight
-
Determines whether or not the value is a
Right.Example
isRight(); // => false isRight(Right.from()); // => true isRight(Left.from(error)); // => false -
staticEither.Left
-
Properties:
Name Type Description LeftLeft Either left. -
staticEither.map
-
Creates an array of values by running each
Eitherin collection through theiteratee. The iteratee is invoked with one argument:(value).Example
Mapping all values to promises
const optionalValues = [ getValue(path1, config), // => Right(value1) getValue(path2, config), // => Right(value2) getValue(path3, config), // => Left(error1) getValue(path4, config) // => Left(error2) ]; Either.map(Either.toPromise, optionalValues); // => [Promise.resolve(price1), Promise.resolve(price2), Promise.reject(error1), Promise.reject(error2)] -
staticEither.mapIn
-
Creates an array of values by invoking
Either#mapwith theiterateefor eachEitherin the collection. The iteratee is invoked with one argument:(value).Example
Mapping each Either's value
const optionalValues = [ getValue(path1, config), // => Right(1.5) getValue(path2, config), // => Right(2.25) getValue(path3, config), // => Left(error1) getValue(path4, config) // => Left(error2) ]; Either.mapIn(Math.floor, optionalValues); // => [Right(1), Right(2), Left(error1), Left(error2)] -
staticEither.of
-
Example
Either.of(); // => Right() Either.of(true); // => Right(true) Either.of(Right.from(value)); // => Right(Right(value)) Either.of(Left.from(error)); // => Right(Left(error)) -
staticEither.reduce
-
Reduces collection to a value which is the accumulated result of running each value in the
valuescollection through theiteratee, where each successive invocation is supplied the return value of the previous. The iteratee is invoked with two arguments:(accumulator, value).Example
const eitherValues = [ getValue(path1, config), // => Right(value1) getValue(path2, config), // => Right(value2) getValue(path3, config), // => Left(error1) getValue(path4, config) // => Left(error2) ]; // Using lodash/fp/concat Either.reduce( (result, value) => value.isRight() ? concat(result, value.get()) : result, [], eitherValues ); // => [value1, value2] -
staticEither.Right
-
Properties:
Name Type Description RightRight Either right. -
staticEither.toMaybe
-
Examples
Right to Just
Either.toMaybe(Maybe, Right.from(value)); // => Maybe.Just(value);Left to Nothing
Either.toMaybe(Maybe, Left.from(error)); // => Maybe.Nothing(); -
staticEither.toPromise
-
Converts a validation to a
Promiseusing the providedPromiseimplementation.Example
Convert with bluebird's implementation of Promise
const toBluebird = Either.toPromise(require("bluebird")); toBluebird(Right.from(value)); // => Promise.resolve(value); toBluebird(Left.from(error)); // => Promise.reject(error); -
staticEither.toValidation
-
Examples
Right to Success
Either.toValidation(Validation, Right.from(value)); // => Validation.Success(value);Left to Failure
Either.toValidation(Validation, Left.from(error)); // => Validation.Failure(); -
staticEither.try
-
Tries to invoke a
supplier. The result of thesupplieris returned in aRight. If an exception is thrown, the error is returned in aLeft. Thefunctiontakes no arguments.Example
Either.try(normalFunction); // => Right(returnValue) Either.try(throwableFunction); // => Left(error)
Methods
-
abstractap(other){Either}
-
Applies the function contained in the instance of a
Rightto the value contained in the providedRight, producing aRightcontaining the result. If the instance is aLeft, the result is theLeftinstance. If the instance is aRightand the providedEitherisLeft, the result is the providedLeft.Name Type Description otherEither Value to apply to the function wrapped in the Right.Returns:
Type Description Either Rightwrapped applied function orLeft.Example
Right#ap
const findPerson = curryN(3, Person.find); // Person.find(name, birthdate, address) Right.from(findPerson) // => Right(findPerson) .ap(Right.try(getName())) // => Right(name) .ap(Right.try(getBirthdate())) // => Right(birthdate) .ap(Right.try(getAddress())) // => Right(address) .ifRight(console.log); // => Log Person.find() response -
abstractbimap(failureMap, successMap){Either}
-
Transforms a
Eitherby applying the first function to the contained value for aLeftor the second function for aRight. The result of each map is wrapped in the corresponding type.Name Type Description failureMapfunction Map to apply to the Left.successMapfunction Map to apply to the Right.Returns:
Type Description Either Eitherwrapped value mapped with the corresponding mapping function.Example
// Using lodash/fp/get Either.try(loadFile) .bimap(get("message"), parseFile) // ... other actions in workflow -
abstractchain(method){Either}
-
Applies the provided function to the value contained for a
Right. The function should return the value wrapped in aEither. If the instance is aLeft, the function is ignored and then instance is returned unchanged.Name Type Description methodChain.<Either> The function to invoke with the value. Returns:
Type Description Either Eitherwrapped value returned by the providedmethod.Example
Right#chain
// Using lodash/fp/curry and getOr const getConfigOption = curry((path, config) => Either.Right.from(getOr( Either.Left.from(`Value not found at "${path}"`), path, config ))); Either.of(config) .chain(getConfigOption("path.to.option")) -
equals(other){Boolean}
-
Determines whether or not the
otheris equal in value to the current (this). This is not a reference check.Name Type Description other* Other value to check. Returns:
Type Description Boolean trueif the two Eithers are equal;falseif not equal.Examples
Reflexivity
v1.equals(v1) === true; // => trueSymmetry
v1.equals(v2) === v2.equals(v1); // => trueTransitivity
(v1.equals(v2) === v2.equals(v3)) && v1.equals(v3) // => true -
abstractextend(){Either}
-
Extends the Either. This is used for workflow continuation where the context has shifted.
Type Description Extend.<Either> method - The function to invoke with the value. Returns:
Type Description Either Example
Workflow continuation
// Workflow from makeRequest.js const makeRequest = requestOptions => requestAsPromise(requestOptions) .then(Right.from) .catch(Left.from); // Workflow from savePerson.js const savePerson = curry((requestOptions, eitherPerson) => eitherPerson .map(Person.from) .map(person => set("body", person, requestOptions)) .map(makeRequest) ); // Workflow from processResponse.js const processResponse = eitherResponse => eitherResponse .ifLeft(console.error) .ifRight(console.log); Either.of(person) .extend(savePerson({ method: "POST" })) .extend(processResponse); -
get(){*}
-
Returns the value if the instance is a
Rightotherwise thenull.Returns:
Type Description * Examples
Right#get
Right.from(value).get(); // => valueLeft#get
Left.from(error).get(); // => null -
abstractifLeft(method){Either}
-
Applies the provided function to the value contain for a
Left. Any return value from the function is ignored. If the instance is aRight, the function is ignored and the instance is returned.Name Type Description methodConsumer The function to invoke with the value. Returns:
Type Description Either Current instance. Examples
Right#ifLeft
Right.from(value).ifLeft(doSomething); // void // => Right(value)Left#ifLeft
Left.from(error).ifLeft(doSomething); // doSomething(error) // => Left(error) -
abstractifRight(method){Either}
-
Applies the provided function to the value contain for a
Right. Any return value from the function is ignored. If the instance is aLeft, the function is ignored and the instance is returned.Name Type Description methodConsumer The function to invoke with the value. Returns:
Type Description Either Current instance. Examples
Right#ifRight
Right.from(value).ifRight(doSomething); // doSomething(value) // => Right(value)Left#ifRight
Left.from(error).ifRight(doSomething); // void // => Left(error) -
isLeft(){Boolean}
-
Determines whether or not the instance is a
Left.Returns:
Type Description Boolean trueif the instance is aLeft;falseis not.Examples
Right#isLeft
Right.from(value).isLeft(); // => falseLeft#isLeft
Left.from(error).isLeft(); // => true -
isRight(){Boolean}
-
Determines whether or not the instance is a
Right.Returns:
Type Description Boolean trueif the instance is aRight;falseis not.Examples
Right
Right.from(value).isLeft(); // => trueLeft#isRight
Left.from(error).isLeft(); // => false -
abstractmap(method){Either}
-
Applies the provided function to the value contained for a
Rightwhich is, in turn, wrapped in aRight. If the instance is aLeft, the function is ignored and then instance is returned unchanged.Name Type Description methodfunction The function to invoke with the value. Returns:
Type Description Either Eitherwrapped value mapped with the providedmethod.Example
// Using lodash/fp/flow and sort Right.from([1, 3, 2]).map(flow(sort, join(", "))); // => Right("1, 2, 3") Left.from(error).map(flow(sort, join(", "))); // => Left(error) -
of()
-
- See:
-
abstractorElse(method){*}
-
Returns the value if the instance is a
Rightotherwise returns the value supplied if the instance is aLeft.Name Type Description methodConsumer The function to invoke with the value. Returns:
Type Description * Examples
Right#orElse
Right.from(value).orElse(otherValue); // => valueLeft#orElse
Left.from(error).orElse(otherValue); // => otherValue -
abstractorElseGet(method){*}
-
Return the value if the instance is a
Rightotherwise returns the value from the function provided.Name Type Description methodSupplier The function supplying the optional value. Returns:
Type Description * Examples
Right#orElseGet
Right.from(value).orElseGet(getOtherValue); // => valueLeft#orElseGet
Left.from(error).orElse(getOtherValue); // => otherValue -
abstractorElseThrow(method){*}
-
Returns the value if the instance is a
Rightotheriwse throws theErrorsupplied by the function provided. The function receives the value of theLeftas its argument.Name Type Description methodfunction The function to invoke with the value. Throws:
-
returned by the provided function.
- Type
- Error
Returns:
Type Description * Examples
Right#orElseThrow
Right.from(value).orElseThrow(createException); // => valueLeft#orElseThrow
Left.from(error).orElseThrow(createException); // throw createException(error) -
-
abstracttoMaybe(maybe){Maybe}
-
Name Type Description maybeMaybe Maybe implementation. Returns:
Type Description Maybe Maybewrappedvalue.Examples
Right#toMaybe
Right.from(value).toMaybe(Maybe); // => Maybe.Just(value);Left#toMaybe
Left.from(error).toMaybe(Maybe); // => Maybe.Nothing(); -
abstracttoPromise(promise){Promise}
-
Converts the Either to a
Promiseusing the providedPromiseimplementation.Name Type Description promisePromise Promise implementation. Returns:
Type Description Promise Promisewrappedvalue.Examples
Right#toPromise
const Bluebird = require("bluebird"); Right.from(value).toPromise(Bluebird); // => Promise.resolve(value);Left#toPromise
const Bluebird = require("bluebird"); Left.from(error).toPromise(Bluebird); // => Promise.reject(error); -
abstracttoString(){String}
-
Returns a
Stringrepresentation of theEither.Returns:
Type Description String Stringrepresentation.Examples
Right#toString
Right.from(1).toString(); // => "Either.Right(1)"Left#toString
Left.from(error).toString(); // => "Either.Left(error)" -
abstracttoValidation(validation){Validation}
-
Name Type Description validationValidation Validation implementation. Returns:
Type Description Validation Validationwrappedvalue.Examples
Right#toValidation
Right.from(value).toValidation(Validation); // => Validation.Success(value);Left#toValidation
Left.from(error).toValidation(Validation); // => Validation.Failure();