sanctuary-js / sanctuary-def

Run-time type system for JavaScript
MIT License
294 stars 23 forks source link

shared mutable environment #317

Closed davidchambers closed 9 months ago

davidchambers commented 9 months ago

This may be the most significant change ever made to the way sanctuary-def works.

This library was built with purity in mind. Type variables in a definition only knew about the set of types closed over by the def function being used. This had far-reaching implications: Sanctuary users working with custom types needed to use a special function (S.create) to create a Sanctuary module whose polymorphic functions could recognize values of these types. This meant that tree shaking would remain impossible for many users even if the Sanctuary source code were to be converted to ECMAScript modules.

This pull request replaces the pure approach with an impure one. The environment, $.config.env, is now shared by all modules that depend on sanctuary-def. It is also (intentionally) mutable. Adding a type to this array will make all functions defined via def aware of this type. This applies to functions previously defined via def and to functions defined via def in the future.

Type checking is now enabled or disabled by assigning true or false respectively to $.config.checkTypes.

As there is now a shared environment and a shared Boolean indicating whether type checking should be performed, we need not support the creation of multiple def functions. This pull request introduces $.def, which makes $.create redundant.

This pull request also removes the dependence on the NODE_ENV environment variable.