diff --git a/src/write-review/write-review-add-author.ts b/src/write-review/write-review-add-author.ts index ff935900f..2734650c4 100644 --- a/src/write-review/write-review-add-author.ts +++ b/src/write-review/write-review-add-author.ts @@ -4,6 +4,7 @@ import * as O from 'fp-ts/Option' import { Reader } from 'fp-ts/Reader' import { constUndefined, flow, pipe } from 'fp-ts/function' import { Status, StatusOpen } from 'hyper-ts' +import * as M from 'hyper-ts/lib/Middleware' import * as RM from 'hyper-ts/lib/ReaderMiddleware' import * as D from 'io-ts/Decoder' import { Orcid, parse } from 'orcid-id-ts' @@ -39,7 +40,10 @@ export const writeReviewAddAuthor = flow( ({ canAddAuthors }) => canAddAuthors, () => 'not-found', ), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state) @@ -50,7 +54,7 @@ export const writeReviewAddAuthor = flow( RM.orElseW(error => match(error) .with('not-found', () => notFound) - .otherwise(() => RM.fromMiddleware(seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi })))), + .otherwise(fromMiddlewareK(() => seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi })))), ), ), ), @@ -246,6 +250,14 @@ function addAuthorForm(preprint: Preprint, otherAuthors: boolean, form: AddAutho }) } +// https://github.com/DenisFrezzato/hyper-ts/pull/83 +const fromMiddlewareK = + , B, I, O, E>( + f: (...a: A) => M.Middleware, + ): ((...a: A) => RM.ReaderMiddleware) => + (...a) => + RM.fromMiddleware(f(...a)) + // https://github.com/DenisFrezzato/hyper-ts/pull/85 function fromReaderK, B, I = StatusOpen, E = never>( f: (...a: A) => Reader, diff --git a/src/write-review/write-review-add-authors.ts b/src/write-review/write-review-add-authors.ts index 2bd93cff2..a3e017d77 100644 --- a/src/write-review/write-review-add-authors.ts +++ b/src/write-review/write-review-add-authors.ts @@ -35,7 +35,10 @@ export const writeReviewAddAuthors = flow( 'canAddAuthors', fromReaderK(({ user }) => canAddAuthors(user)), ), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state) diff --git a/src/write-review/write-review-authors.ts b/src/write-review/write-review-authors.ts index 8ffe17487..52a02035e 100644 --- a/src/write-review/write-review-authors.ts +++ b/src/write-review/write-review-authors.ts @@ -29,7 +29,10 @@ export const writeReviewAuthors = flow( pipe( RM.right({ preprint }), RM.apS('user', getUserFromSession()), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state).with({ method: 'POST' }, handleAuthorsForm).otherwise(showAuthorsForm)), RM.orElseMiddlewareK(() => seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi }))), diff --git a/src/write-review/write-review-change-author.ts b/src/write-review/write-review-change-author.ts index 50bc47be4..88eaaf5ba 100644 --- a/src/write-review/write-review-change-author.ts +++ b/src/write-review/write-review-change-author.ts @@ -1,11 +1,11 @@ import { format } from 'fp-ts-routing' import * as E from 'fp-ts/Either' -import { fromOption as fromOption_ } from 'fp-ts/FromEither' import * as O from 'fp-ts/Option' import { Reader } from 'fp-ts/Reader' import * as RA from 'fp-ts/ReadonlyArray' import { Lazy, constUndefined, flow, pipe } from 'fp-ts/function' import { Status, StatusOpen } from 'hyper-ts' +import * as M from 'hyper-ts/lib/Middleware' import * as RM from 'hyper-ts/lib/ReaderMiddleware' import * as D from 'io-ts/Decoder' import { Orcid, parse } from 'orcid-id-ts' @@ -38,11 +38,15 @@ export const writeReviewChangeAuthor = (doi: PreprintId['doi'], index: number) = ({ canAddAuthors }) => canAddAuthors, () => 'not-found', ), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), - RM.bindW('author', ({ form }) => - fromOption(() => 'not-found')( - pipe( - O.fromNullable(form.otherAuthors), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), + RM.bindW( + 'author', + fromOptionK(() => 'not-found')( + flow( + O.fromNullableK(({ form }) => form.otherAuthors), O.chain(RA.lookup(index)), O.let('index', () => index), ), @@ -58,7 +62,7 @@ export const writeReviewChangeAuthor = (doi: PreprintId['doi'], index: number) = RM.orElseW(error => match(error) .with('not-found', () => notFound) - .otherwise(() => RM.fromMiddleware(seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi })))), + .otherwise(fromMiddlewareK(() => seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi })))), ), ), ), @@ -277,6 +281,14 @@ function changeAuthorForm(preprint: Preprint, author: Author, form: ChangeAuthor }) } +// https://github.com/DenisFrezzato/hyper-ts/pull/83 +const fromMiddlewareK = + , B, I, O, E>( + f: (...a: A) => M.Middleware, + ): ((...a: A) => RM.ReaderMiddleware) => + (...a) => + RM.fromMiddleware(f(...a)) + // https://github.com/DenisFrezzato/hyper-ts/pull/85 function fromReaderK, B, I = StatusOpen, E = never>( f: (...a: A) => Reader, @@ -284,6 +296,11 @@ function fromReaderK, B, I = StatusOpen, E = return (...a) => RM.rightReader(f(...a)) } -// https://github.com/DenisFrezzato/hyper-ts/pull/89 -const fromOption: (onNone: Lazy) => (ma: O.Option) => RM.ReaderMiddleware = - fromOption_(RM.FromEither) +// https://github.com/DenisFrezzato/hyper-ts/pull/88 +function fromOptionK( + onNone: Lazy, +): , B>( + f: (...a: A) => O.Option, +) => (...a: A) => RM.ReaderMiddleware { + return f => fromMiddlewareK((...a) => M.fromOption(onNone)(f(...a))) +} diff --git a/src/write-review/write-review-competing-interests.ts b/src/write-review/write-review-competing-interests.ts index 6bf0b4889..894968d7a 100644 --- a/src/write-review/write-review-competing-interests.ts +++ b/src/write-review/write-review-competing-interests.ts @@ -24,7 +24,10 @@ export const writeReviewCompetingInterests = flow( pipe( RM.right({ preprint }), RM.apS('user', getUserFromSession()), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state).with({ method: 'POST' }, handleCompetingInterestsForm).otherwise(showCompetingInterestsForm), diff --git a/src/write-review/write-review-conduct.ts b/src/write-review/write-review-conduct.ts index 97c825e1b..a29194771 100644 --- a/src/write-review/write-review-conduct.ts +++ b/src/write-review/write-review-conduct.ts @@ -22,7 +22,10 @@ export const writeReviewConduct = flow( pipe( RM.right({ preprint }), RM.apS('user', getUserFromSession()), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state).with({ method: 'POST' }, handleCodeOfConductForm).otherwise(showCodeOfConductForm), diff --git a/src/write-review/write-review-persona.ts b/src/write-review/write-review-persona.ts index d890a8326..f7ea6a002 100644 --- a/src/write-review/write-review-persona.ts +++ b/src/write-review/write-review-persona.ts @@ -22,7 +22,10 @@ export const writeReviewPersona = flow( pipe( RM.right({ preprint }), RM.apS('user', getUserFromSession()), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state).with({ method: 'POST' }, handlePersonaForm).otherwise(showPersonaForm)), RM.orElseMiddlewareK(() => seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi }))), diff --git a/src/write-review/write-review-post.ts b/src/write-review/write-review-post.ts index 7a81821cd..ca1f54bd7 100644 --- a/src/write-review/write-review-post.ts +++ b/src/write-review/write-review-post.ts @@ -55,7 +55,10 @@ export const writeReviewPost = flow( 'canAddAuthors', fromReaderK(({ user }) => canAddAuthors(user)), ), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state) diff --git a/src/write-review/write-review-remove-author.ts b/src/write-review/write-review-remove-author.ts index c90e9daa5..0a7361846 100644 --- a/src/write-review/write-review-remove-author.ts +++ b/src/write-review/write-review-remove-author.ts @@ -1,6 +1,5 @@ import { format } from 'fp-ts-routing' import * as E from 'fp-ts/Either' -import { fromOption as fromOption_ } from 'fp-ts/FromEither' import * as O from 'fp-ts/Option' import { Reader } from 'fp-ts/Reader' import * as RA from 'fp-ts/ReadonlyArray' @@ -43,11 +42,15 @@ export const writeReviewRemoveAuthor = (doi: PreprintId['doi'], index: number) = ({ canAddAuthors }) => canAddAuthors, () => 'not-found', ), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), - RM.bindW('author', ({ form }) => - fromOption(() => 'not-found')( - pipe( - O.fromNullable(form.otherAuthors), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), + RM.bindW( + 'author', + fromOptionK(() => 'not-found')( + flow( + O.fromNullableK(({ form }) => form.otherAuthors), O.chain(RA.lookup(index)), O.let('index', () => index), ), @@ -63,7 +66,7 @@ export const writeReviewRemoveAuthor = (doi: PreprintId['doi'], index: number) = RM.orElseW(error => match(error) .with('not-found', () => notFound) - .otherwise(() => RM.fromMiddleware(seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi })))), + .otherwise(fromMiddlewareK(() => seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi })))), ), ), ), @@ -273,6 +276,11 @@ function fromReaderK, B, I = StatusOpen, E = return (...a) => RM.rightReader(f(...a)) } -// https://github.com/DenisFrezzato/hyper-ts/pull/89 -const fromOption: (onNone: Lazy) => (ma: O.Option) => RM.ReaderMiddleware = - fromOption_(RM.FromEither) +// https://github.com/DenisFrezzato/hyper-ts/pull/88 +function fromOptionK( + onNone: Lazy, +): , B>( + f: (...a: A) => O.Option, +) => (...a: A) => RM.ReaderMiddleware { + return f => fromMiddlewareK((...a) => M.fromOption(onNone)(f(...a))) +} diff --git a/src/write-review/write-review-review.ts b/src/write-review/write-review-review.ts index 1d7deae9d..eca7776d3 100644 --- a/src/write-review/write-review-review.ts +++ b/src/write-review/write-review-review.ts @@ -23,7 +23,10 @@ export const writeReviewReview = flow( pipe( RM.right({ preprint }), RM.apS('user', getUserFromSession()), - RM.bindW('form', ({ user }) => RM.rightReaderTask(getForm(user.orcid, preprint.doi))), + RM.bindW( + 'form', + RM.fromReaderTaskK(({ user }) => getForm(user.orcid, preprint.doi)), + ), RM.apSW('method', RM.fromMiddleware(getMethod)), RM.ichainW(state => match(state).with({ method: 'POST' }, handleReviewForm).otherwise(showReviewForm)), RM.orElseMiddlewareK(() => seeOther(format(writeReviewMatch.formatter, { doi: preprint.doi }))),