Overview
The Validation
functor, used for applicative validation
The Applicative
instance collects multiple failures in an arbitrary Semigroup
.
Adapted from https://github.com/purescript/purescript-validation
Table of contents
- URI (type alias)
- Validation (type alias)
- Failure (class)
- Success (class)
- URI (constant)
- validation (constant)
- failure (function)
- fromEither (function)
- fromPredicate (function)
- getAlt (function)
- getApplicative (function)
- getCompactable (function)
- getFilterable (function)
- getMonad (function)
- getMonoid (function)
- getSemigroup (function)
- getSetoid (function)
- getWitherable (function)
- isFailure (function)
- isSuccess (function)
- success (function)
URI (type alias)
Signature
export type URI = typeof URI
Validation (type alias)
Signature
export type Validation<L, A> = Failure<L, A> | Success<L, A>
Example
import { Validation, getApplicative, success, failure } from 'fp-ts/lib/Validation'
import { NonEmptyArray, getSemigroup } from 'fp-ts/lib/NonEmptyArray'
interface Person {
readonly name: string
readonly age: number
}
// curried constructor
const person = (name: string) => (age: number): Person => ({ name, age })
// validators
function validateName(input: string): Validation<NonEmptyArray<string>, string> {
return input.length === 0 ? failure(new NonEmptyArray('Invalid name: empty string', [])) : success(input)
}
function validateAge(input: string): Validation<NonEmptyArray<string>, number> {
const n = parseFloat(input)
if (isNaN(n)) {
return failure(new NonEmptyArray(`Invalid age: not a number ${input}`, []))
}
return n % 1 !== 0 ? failure(new NonEmptyArray(`Invalid age: not an integer ${n}`, [])) : success(n)
}
// get an `Applicative` instance for Validation<NonEmptyArray<string>, ?>
const A = getApplicative(getSemigroup<string>())
function validatePerson(input: Record<string, string>): Validation<NonEmptyArray<string>, Person> {
return A.ap(validateName(input['name']).map(person), validateAge(input['age']))
}
assert.deepStrictEqual(
validatePerson({ name: '', age: '1.2' }),
failure(new NonEmptyArray('Invalid name: empty string', ['Invalid age: not an integer 1.2']))
)
assert.deepStrictEqual(validatePerson({ name: 'Giulio', age: '44' }), success({ name: 'Giulio', age: 44 }))
Added in v1.0.0
Failure (class)
Signature
export class Failure<L, A> {
constructor(readonly value: L) { ... }
...
}
map (method)
Signature
map<B>(f: (a: A) => B): Validation<L, B> { ... }
bimap (method)
Signature
bimap<V, B>(f: (l: L) => V, g: (a: A) => B): Validation<V, B> { ... }
reduce (method)
Signature
reduce<B>(b: B, f: (b: B, a: A) => B): B { ... }
fold (method)
Signature
fold<B>(failure: (l: L) => B, success: (a: A) => B): B { ... }
getOrElse (method)
Returns the value from this Success
or the given argument if this is a Failure
Signature
getOrElse(a: A): A { ... }
getOrElseL (method)
Returns the value from this Success
or the result of given argument if this is a Failure
Signature
getOrElseL(f: (l: L) => A): A { ... }
mapFailure (method)
Signature
mapFailure<M>(f: (l: L) => M): Validation<M, A> { ... }
swap (method)
Signature
swap(): Validation<A, L> { ... }
inspect (method)
Signature
inspect(): string { ... }
toString (method)
Signature
toString(): string { ... }
isFailure (method)
Returns true
if the validation is an instance of Failure
, false
otherwise
Signature
isFailure(): this is Failure<L, A> { ... }
isSuccess (method)
Returns true
if the validation is an instance of Success
, false
otherwise
Signature
isSuccess(): this is Success<L, A> { ... }
Success (class)
Signature
export class Success<L, A> {
constructor(readonly value: A) { ... }
...
}
map (method)
Signature
map<B>(f: (a: A) => B): Validation<L, B> { ... }
bimap (method)
Signature
bimap<V, B>(f: (l: L) => V, g: (a: A) => B): Validation<V, B> { ... }
reduce (method)
Signature
reduce<B>(b: B, f: (b: B, a: A) => B): B { ... }
fold (method)
Signature
fold<B>(failure: (l: L) => B, success: (a: A) => B): B { ... }
getOrElse (method)
Signature
getOrElse(a: A): A { ... }
getOrElseL (method)
Signature
getOrElseL(f: (l: L) => A): A { ... }
mapFailure (method)
Signature
mapFailure<M>(f: (l: L) => M): Validation<M, A> { ... }
swap (method)
Signature
swap(): Validation<A, L> { ... }
inspect (method)
Signature
inspect(): string { ... }
toString (method)
Signature
toString(): string { ... }
isFailure (method)
Signature
isFailure(): this is Failure<L, A> { ... }
isSuccess (method)
Signature
isSuccess(): this is Success<L, A> { ... }
URI (constant)
Signature
export const URI = ...
validation (constant)
Signature
export const validation: Functor2<URI> & Bifunctor2<URI> & Foldable2v2<URI> & Traversable2v2<URI> = ...
Added in v1.0.0
failure (function)
Signature
export const failure = <L, A>(l: L): Validation<L, A> => ...
Added in v1.0.0
fromEither (function)
Signature
export const fromEither = <L, A>(e: Either<L, A>): Validation<L, A> => ...
Added in v1.0.0
fromPredicate (function)
Signature
export function fromPredicate<L, A, B extends A>(
predicate: Refinement<A, B>,
f: (a: A) => L
): (a: A) => Validation<L, B>
export function fromPredicate<L, A>(predicate: Predicate<A>, f: (a: A) => L): (a: A) => Validation<L, A> { ... }
Added in v1.0.0
getAlt (function)
Signature
export const getAlt = <L>(S: Semigroup<L>): Alt2C<URI, L> => ...
Added in v1.0.0
getApplicative (function)
Signature
export const getApplicative = <L>(S: Semigroup<L>): Applicative2C<URI, L> => ...
Example
import { Validation, success, failure, getApplicative } from 'fp-ts/lib/Validation'
import { getArraySemigroup } from 'fp-ts/lib/Semigroup'
interface Person {
name: string
age: number
}
const person = (name: string) => (age: number): Person => ({ name, age })
const validateName = (name: string): Validation<string[], string> =>
name.length === 0 ? failure(['invalid name']) : success(name)
const validateAge = (age: number): Validation<string[], number> =>
age > 0 && age % 1 === 0 ? success(age) : failure(['invalid age'])
const A = getApplicative(getArraySemigroup<string>())
const validatePerson = (name: string, age: number): Validation<string[], Person> =>
A.ap(A.map(validateName(name), person), validateAge(age))
assert.deepStrictEqual(validatePerson('Nicolas Bourbaki', 45), success({ name: 'Nicolas Bourbaki', age: 45 }))
assert.deepStrictEqual(validatePerson('Nicolas Bourbaki', -1), failure(['invalid age']))
assert.deepStrictEqual(validatePerson('', 0), failure(['invalid name', 'invalid age']))
Added in v1.0.0
getCompactable (function)
Builds Compactable
instance for Validation
given Monoid
for the failure side
Signature
export function getCompactable<L>(ML: Monoid<L>): Compactable2C<URI, L> { ... }
Added in v1.7.0
getFilterable (function)
Builds Filterable
instance for Validation
given Monoid
for the left side
Signature
export function getFilterable<L>(ML: Monoid<L>): Filterable2C<URI, L> { ... }
Added in v1.7.0
getMonad (function)
Note: This function is here just to avoid switching to / from Either
Signature
export const getMonad = <L>(S: Semigroup<L>): Monad2C<URI, L> => ...
Added in v1.0.0
getMonoid (function)
Signature
export const getMonoid = <L, A>(SL: Semigroup<L>, SA: Monoid<A>): Monoid<Validation<L, A>> => ...
Added in v1.0.0
getSemigroup (function)
Signature
export const getSemigroup = <L, A>(SL: Semigroup<L>, SA: Semigroup<A>): Semigroup<Validation<L, A>> => ...
Added in v1.0.0
getSetoid (function)
Signature
export const getSetoid = <L, A>(SL: Setoid<L>, SA: Setoid<A>): Setoid<Validation<L, A>> => ...
Added in v1.0.0
getWitherable (function)
Builds Witherable
instance for Validation
given Monoid
for the left side
Signature
export function getWitherable<L>(ML: Monoid<L>): Witherable2C<URI, L> { ... }
Added in v1.7.0
isFailure (function)
Returns true
if the validation is an instance of Failure
, false
otherwise
Signature
export const isFailure = <L, A>(fa: Validation<L, A>): fa is Failure<L, A> => ...
Added in v1.0.0
isSuccess (function)
Returns true
if the validation is an instance of Success
, false
otherwise
Signature
export const isSuccess = <L, A>(fa: Validation<L, A>): fa is Success<L, A> => ...
Added in v1.0.0
success (function)
Signature
export const success = <L, A>(a: A): Validation<L, A> => ...
Added in v1.0.0