Skip to content

Commit

Permalink
Feature/filterable (#492)
Browse files Browse the repository at this point in the history
* feature: Filterable // typeclass

* feature: Filterable // use .prettierrc/.prettierignore to support WS watchers

* feature: Filterable // default implementations

* feature: Filterable // default implementations + tests

* feature: Filterable // default implementations

* feature: Filterable // remove CompactableA, Compactable1A

* feature: Filterable // postreview
  • Loading branch information
raveclassic authored Jun 25, 2018
1 parent 4945741 commit 3284938
Show file tree
Hide file tree
Showing 9 changed files with 607 additions and 84 deletions.
6 changes: 6 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/lib
/docs
/docs-generator
/perf
/node_modules
/typings-checker
6 changes: 6 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"semi": false,
"singleQuote": true,
"printWidth": 120,
"parser": "typescript"
}
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
"lint": "tslint -p tsconfig.json src/**/*.ts test/**/*.ts examples/**/*.ts exercises/**/*.ts fantas-eel-and-specification/**/*.ts",
"jest": "jest --ci",
"jest-coverage": "jest --ci --coverage",
"prettier": "prettier --no-semi --single-quote --print-width 120 --parser typescript --list-different \"{src,test,examples,exercises}/**/*.ts\"",
"fix-prettier": "prettier --no-semi --single-quote --print-width 120 --parser typescript --write \"{src,test,examples,exercises}/**/*.ts\"",
"prettier": "prettier --list-different \"./{src,test,examples,exercises}/**/*.ts\"",
"fix-prettier": "prettier --write \"./{src,test,examples,exercises}/**/*.ts\"",
"typings": "typings-checker --project ./typings-checker/tsconfig.json ./typings-checker/index.ts",
"test": "npm run lint && npm run prettier && npm run typings && npm run jest",
"clean": "rimraf lib/*",
Expand Down
110 changes: 70 additions & 40 deletions src/Compactable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { HKT, Type, Type2, Type3, URIS, URIS2, URIS3 } from './HKT'
import { fromEither, Option } from './Option'
import { Either, fromOption } from './Either'
import { Functor, Functor1, Functor2, Functor2C, Functor3, Functor3C } from './Functor'
import { Filterable, Filterable1, Filterable2, Filterable2C, Filterable3, Filterable3C } from './Filterable'
import { identity } from './function'

/**
* `Separated` type which holds `left` and `right` parts
Expand Down Expand Up @@ -35,19 +37,6 @@ export interface Compactable<F> {
readonly separate: <A, B>(fa: HKT<F, Either<A, B>>) => Separated<HKT<F, A>, HKT<F, B>>
}

/**
* @see Compactable
* @since 1.7.0
*/
export interface CompactableA<F, A, RL, RR> {
readonly URI: F
readonly _A: A
readonly _RL: RL
readonly _RR: RR
readonly compact: (fa: HKT<F, Option<A>>) => HKT<F, A>
readonly separate: (fa: HKT<F, Either<RL, RR>>) => Separated<HKT<F, RL>, HKT<F, RR>>
}

/**
* @see Compactable
* @since 1.7.0
Expand All @@ -58,19 +47,6 @@ export interface Compactable1<F extends URIS> {
readonly separate: <A, B>(fa: Type<F, Either<A, B>>) => Separated<Type<F, A>, Type<F, B>>
}

/**
* @see Compactable
* @since 1.7.0
*/
export interface Compactable1A<F extends URIS, A, RL, RR> {
readonly URI: F
readonly _A: A
readonly _RL: RL
readonly _RR: RR
readonly compact: (fa: Type<F, Option<A>>) => Type<F, A>
readonly separate: (fa: Type<F, Either<RL, RR>>) => Separated<Type<F, RL>, Type<F, RR>>
}

/**
* @see Compactable
* @since 1.7.0
Expand Down Expand Up @@ -119,51 +95,105 @@ export interface Compactable3C<F extends URIS3, U, L> {
* @function
* @since 1.7.0
*/
export function compactDefault<F extends URIS3, U, L>(
export function getCompactFromSeparate<F extends URIS3, U, L>(
F: Functor3C<F, U, L> & Pick<Compactable3C<F, U, L>, 'separate'>
): Compactable3C<F, U, L>['compact']
export function compactDefault<F extends URIS3>(
export function getCompactFromSeparate<F extends URIS3>(
F: Functor3<F> & Pick<Compactable3<F>, 'separate'>
): Compactable3<F>['compact']
export function compactDefault<F extends URIS2, L>(
export function getCompactFromSeparate<F extends URIS2, L>(
F: Functor2C<F, L> & Pick<Compactable2C<F, L>, 'separate'>
): Compactable2C<F, L>['compact']
export function compactDefault<F extends URIS2>(
export function getCompactFromSeparate<F extends URIS2>(
F: Functor2<F> & Pick<Compactable2<F>, 'separate'>
): Compactable2<F>['compact']
export function compactDefault<F extends URIS>(
export function getCompactFromSeparate<F extends URIS>(
F: Functor1<F> & Pick<Compactable1<F>, 'separate'>
): Compactable1<F>['compact']
export function compactDefault<F>(F: Functor<F> & Pick<Compactable<F>, 'separate'>): Compactable<F>['compact']
export function compactDefault<F>(F: Functor<F> & Pick<Compactable<F>, 'separate'>): Compactable<F>['compact'] {
export function getCompactFromSeparate<F>(F: Functor<F> & Pick<Compactable<F>, 'separate'>): Compactable<F>['compact']
export function getCompactFromSeparate<F>(F: Functor<F> & Pick<Compactable<F>, 'separate'>): Compactable<F>['compact'] {
return foa => F.separate(F.map(foa, fromOption(null))).right
}

/**
* Gets default implementation of {@link Compactable.compact} using {@link Filterable.filterMap}
* @function
* @since 1.7.0
*/
export function getCompactFromFilterMap<F extends URIS3, U, L>(
F: Pick<Filterable3C<F, U, L>, 'URI' | 'filterMap'>
): Compactable3C<F, U, L>['compact']
export function getCompactFromFilterMap<F extends URIS3>(
F: Pick<Filterable3<F>, 'URI' | 'filterMap'>
): Compactable3<F>['compact']
export function getCompactFromFilterMap<F extends URIS2, L>(
F: Pick<Filterable2C<F, L>, 'URI' | 'filterMap'>
): Compactable2C<F, L>['compact']
export function getCompactFromFilterMap<F extends URIS2>(
F: Pick<Filterable2<F>, 'URI' | 'filterMap'>
): Compactable2<F>['compact']
export function getCompactFromFilterMap<F extends URIS>(
F: Pick<Filterable1<F>, 'URI' | 'filterMap'>
): Compactable1<F>['compact']
export function getCompactFromFilterMap<F>(F: Pick<Filterable<F>, 'URI' | 'filterMap'>): Compactable<F>['compact']
export function getCompactFromFilterMap<F>(F: Pick<Filterable<F>, 'URI' | 'filterMap'>): Compactable<F>['compact'] {
return fa => F.filterMap(fa, identity)
}

/**
* Gets default implementation of {@link Compactable.separate} using {@link Compactable.compact}
* @function
* @since 1.7.0
*/
export function separateDefault<F extends URIS3, U, L>(
export function getSeparateFromCompact<F extends URIS3, U, L>(
F: Functor3C<F, U, L> & Pick<Compactable3C<F, U, L>, 'compact'>
): Compactable3C<F, U, L>['separate']
export function separateDefault<F extends URIS3>(
export function getSeparateFromCompact<F extends URIS3>(
F: Functor3<F> & Pick<Compactable3<F>, 'compact'>
): Compactable3<F>['separate']
export function separateDefault<F extends URIS2, L>(
export function getSeparateFromCompact<F extends URIS2, L>(
F: Functor2C<F, L> & Pick<Compactable2C<F, L>, 'compact'>
): Compactable2C<F, L>['separate']
export function separateDefault<F extends URIS2>(
export function getSeparateFromCompact<F extends URIS2>(
F: Functor2<F> & Pick<Compactable2<F>, 'compact'>
): Compactable2<F>['separate']
export function separateDefault<F extends URIS>(
export function getSeparateFromCompact<F extends URIS>(
F: Functor1<F> & Pick<Compactable1<F>, 'compact'>
): Compactable1<F>['separate']
export function separateDefault<F>(F: Functor<F> & Pick<Compactable<F>, 'compact'>): Compactable<F>['separate']
export function separateDefault<F>(F: Functor<F> & Pick<Compactable<F>, 'compact'>): Compactable<F>['separate'] {
export function getSeparateFromCompact<F>(F: Functor<F> & Pick<Compactable<F>, 'compact'>): Compactable<F>['separate']
export function getSeparateFromCompact<F>(F: Functor<F> & Pick<Compactable<F>, 'compact'>): Compactable<F>['separate'] {
return fe => {
const left = F.compact(F.map(fe, e => fromEither(e.swap())))
const right = F.compact(F.map(fe, fromEither))
return { left, right }
}
}

/**
* Gets default implementation of {@link Compactable.separate} using {@link Filterable.partitionMap}
* @function
* @since 1.7.0
*/
export function getSeparateFromPartitionMap<F extends URIS3, U, L>(
F: Pick<Filterable3C<F, U, L>, 'URI' | 'partitionMap'>
): Compactable3C<F, U, L>['separate']
export function getSeparateFromPartitionMap<F extends URIS3>(
F: Pick<Filterable3<F>, 'URI' | 'partitionMap'>
): Compactable3<F>['separate']
export function getSeparateFromPartitionMap<F extends URIS2, L>(
F: Pick<Filterable2C<F, L>, 'URI' | 'partitionMap'>
): Compactable2C<F, L>['separate']
export function getSeparateFromPartitionMap<F extends URIS2>(
F: Pick<Filterable2<F>, 'URI' | 'partitionMap'>
): Compactable2<F>['separate']
export function getSeparateFromPartitionMap<F extends URIS>(
F: Pick<Filterable1<F>, 'URI' | 'partitionMap'>
): Compactable1<F>['separate']
export function getSeparateFromPartitionMap<F>(
F: Pick<Filterable<F>, 'URI' | 'partitionMap'>
): Compactable<F>['separate']
export function getSeparateFromPartitionMap<F>(
F: Pick<Filterable<F>, 'URI' | 'partitionMap'>
): Compactable<F>['separate'] {
return fa => F.partitionMap(fa, identity)
}
Loading

0 comments on commit 3284938

Please sign in to comment.