Purify v0.11
September 20, 2018
Not sure what purify is? Check out the
Getting Started page. The package was renamed from `pure-ts` because of NSFW search results.
NonEmptyList
The new NonEmptyList ADT is a list that is guaranteed to have at least one value. Because of it's utility there is an implementation of this data structure in pretty much all ML languages, which is why it's now a part of purify too. Let's look at some example code:
import { NonEmptyList, head } from 'purify-ts/adts/NonEmptyList'
// Create functions with a contract - the caller has to verify that the input is valid instead of the callee
// Since the list parameter is guaranteed to have at least one element, this function will always return a value
const getRandomElement = <T>(list: NonEmptyList<T>): T =>
list[Math.floor(Math.random() * list.length)]
// Doesn't compile
getRandomElement(NonEmptyList([]))
// Compiles, you don't need to check for elements if the list length is known at compile time
getRandomElement(NonEmptyList([1]))
// For runtime values, you have to deal with a Maybe
const numbers: number[] = getArrayFromForm()
const randEl: Maybe<number> = NonEmptyList.fromArray(numbers).map(getRandomElement)
Maybe and Either predicates narrow the type
v0.11 makes a lot of improvements to type safety. Using one of TypeScript's more unique features - type predicates, the compiler can now know when it's safe to extract a value from a Maybe or Either.
const sometimesValue: Maybe<number> = ...
sometimesValue.extract() // number | null
if (sometimesValue.isJust()) {
// Because extract() is in a block that guarantees the presence of a value, it's safe to return a number instead of a nullable number
sometimesValue.extract() // number
}
Wildcard pattern for pattern matching
You can now use a wildcard when pattern matching a Maybe, Either or any other ADT that supports pattern matching.
// v0.10
adt.caseOf({ Just: value => 0, Nothing: () => 0})
// Now
adt.caseOf({ _: () => 0 })
Tuple support for more array behaviour
Tuples now implement the Iterable and ArrayLike interfaces.
const [ fst, snd ] = Tuple(1, 2)
New Maybe and Either methods
Check out the docs for Maybe and Either to find out more about the following methods:
- Maybe.fromPredicate, Maybe#join and Maybe#orDefaultLazy
- Either#join and Either#orDefaultLazy
Improved pretty printing
When using
toString on ADT instances now it displays the constructor name. Keep in mind that this behaviour is strictly for pretty printing, in the case of
JSON.stringify it strips out any ADT info and leaves only relevant JSON data.
const val = Just(5)
console.log(val.toString()) // "Just(5)"
console.log(JSON.stringify(val)) // "5"
All functions with multiple arguments support partial application
Added partial application support to: List#at
Improved partial application for: Tuple.fanout, Maybe.mapMaybe
Other changes
- Removed Semigroup and Ord instances because they were not sound and making them typesafe required using very confusing type definitions.
- Fixed Either#isRight type definition (thanks sledorze)
- Made the value property inside the Maybe class private
- Reduced package size by excluding the tests
- Many improvements (rewordings, corrections and clarifications) made to the docs (thanks squirly)