|
- /**
- * The `Alternative` type class extends the `Alt` type class with a value that should be the left and right identity for `alt`.
- *
- * It is similar to `Monoid`, except that it applies to types of kind `* -> *`, like `Array` or `Option`, rather than
- * concrete types like `string` or `number`.
- *
- * `Alternative` instances should satisfy the following laws:
- *
- * 1. Left identity: `A.alt(zero, fa) <-> fa`
- * 2. Right identity: `A.alt(fa, zero) <-> fa`
- * 3. Annihilation: `A.map(zero, f) <-> zero`
- * 4. Distributivity: `A.ap(A.alt(fab, gab), fa) <-> A.alt(A.ap(fab, fa), A.ap(gab, fa))`
- * 5. Annihilation: `A.ap(zero, fa) <-> zero`
- *
- * @since 2.0.0
- */
- import { altAll as altAll_ } from './Alt';
- import { getApplySemigroup } from './Apply';
- export function altAll(F) {
- return altAll_(F)(F.zero());
- }
- export function getAlternativeMonoid(F) {
- var f = getApplySemigroup(F);
- return function (S) {
- var SF = f(S);
- return {
- concat: function (first, second) {
- return F.alt(SF.concat(first, second), function () { return F.alt(first, function () { return second; }); });
- },
- empty: F.zero()
- };
- };
- }
|