Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/filterable #492

Merged
merged 7 commits into from
Jun 25, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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>(
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why the renaming? Also I don't understand compactDefaultFilterMap and separateDefaultPartitionMap, they seem trivial. Maybe we can just add some documentation explaining how to derive compact/separate from filterMap/partitionMap and avoid some bloat

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renaming is to be explicit in what is needed for default implementation since there's more than one way to get it. The name reflects purescript implementation, firstly I picked this convention: get<Name>From<OtherName> which is more readabe.

Although they are trivial you still need to write them each time, I think it's just handy to have them as a part of the library as well as they are a good way of reflecting relation between these typeclasses, don't you think?

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