I have the following code:
import { Task, task } from "fp-ts/lib/Task"
import { Either, left, right } from "fp-ts/lib/Either"
import { curry } from "fp-ts/lib/function"
import { liftA2 } from "fp-ts/lib/Apply"
import { Repo } from "./repo"
const buildPerson = curry((name: string, age: number): Either<Error, any> => {
if (name !== undefined && age !== undefined) {
return right({ name, age })
} else {
return left(Error("Missing parameter"))
}
})
const validatePerson = (person: any): Either<Error, any> => {
if ( person.age < 18) {
return left(Error("Too Young"))
} else {
return right(person)
}
}
const getNameFromRepo = (repo: Repo): Task<string> => {
return new Task(
() => repo.getName()
)
}
const getAgeFromRepo = (repo: Repo): Task<number> => {
return new Task(
() => repo.getAge()
)
}
const savePerson = curry((person:any, repo: Repo): Task<void> => {
return new Task(
() => {
console.log(person)
return repo.setPerson(person)
}
)
})
const hello = async () => {
const repo = new Repo()
await liftA2(task)(buildPerson)(getNameFromRepo(repo))(getAgeFromRepo(repo))
.map(
(e) => e.chain(
(p) => validatePerson(p)
)
)
.map(
(e) => e.fold(
(l) => console.log(l),
(r) => savePerson(r)
)
)
.run()
}
hello()
1) savePerson function doesn't get run, return type however is Promise
2) Fp-Ts library indicates that liftA2 type is deprecated and I should use sequenceT instead. However from the signature it's not clear how sequenceT would apply to the parameters of buildPerson like liftA2 does
3) Is there a better way to compose the functions?