• Stars
    star
    696
  • Rank 65,018 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 11 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Library for creating tagged constructors.

Daggy

Build Status npm

Library for creating tagged constructors a.k.a. "disjoint union types" or "sum types".

Motivation

JavaScript does not have first class support for sum types, but they can be imitated in a handful of different ways. Nevertheless, this imitation leads to excess boilerplate that can lead to extra work and the potential for errors:

const successCase = { success: true, items: [1, 2, 3] }
const failureCase = { success: false, error: 'There was a problem.' }

function handleResult(result) {
  if (result.success) {
    console.log(result.items)
  } else {
    console.error(result.error)
  }
}

Daggy reduces the boilerplate needed to represent sum types in JavaScript:

const Result = daggy.taggedSum('Result', {
  Success: ['items'],
  Failure: ['error']
})

const successCase = Result.Success([1, 2, 3])
const failureCase = Result.Failure('There was a problem.')

function handleResult(result) {
  result.cata({
    Success: message => console.log(message),
    Failure: error => console.error(error)
  })
}

API

daggy.tagged(typeName, fields)

Creates a new constructor with the given field names

const Point3D = daggy.tagged('Point3D', ['x', 'y', 'z'])
Point3D.toString() // 'Point3D'
const a = Point3D(1, 2, 3) // { x: 1, y: 2, z: 3 }
a.x == 1 && a.y == 2 && a.z == 3 // true
a.toString() // 'Point3D(1, 2, 3)'
Point3D.is(a) // true
Point3D.prototype.scale = function(n){
  return Point3D(this.x * n, this.y * n, this.z * n)
}
const b = a.scale(2) // { x: 2, y: 4, z: 6 }
b.toString() // 'Point3D(2, 4, 6)'
const c = Point3D.from({y: 2, x: 1, z: 3}) // { x: 1, y: 2, z: 3 }

daggy.taggedSum(typeName, constructors)

Returns Type Representative containing constructors of for each key in constructors as a property. Allows {TypeRep}.is and {TypeRep}.{Tag}.is checks for values created by constructors.

const Option = daggy.taggedSum('Option', {
  Some: ['x'],
  None: [],
})
const a = Option.Some(1) // { x: 1 }
a.toString() // 'Option.Some(1)'
Option.Some.is(a) // true
Option.is(a) // true
Option.None.is(Option.None) // true
Option.is(Option.None) // true
Option.None.toString() // 'Option.None'
Option.Some.toString() // 'Option.Some'
Option.prototype.map = function (f) {
  return this.cata({
    Some: (x) => Option.Some(f(x)),
    None: () => this,
  })
}
const b = a.map(x => x+1) // { x: 2 }
b.toString() // 'Option.Some(2)'
const c = Option.Some.from({x: 1}) // { x: 1 }

More Repositories

1

fantasy-land

Specification for interoperability of common algebraic structures in JavaScript
JavaScript
9,863
star
2

static-land

Specification for common algebraic structures in JavaScript based on Fantasy Land
JavaScript
771
star
3

fantasy-lenses

Composable, immutable getters and setters.
JavaScript
108
star
4

fantasy-promises

JavaScript
89
star
5

fantasy-birds

port of the haskell package Data.Aviary.Birds. Every thing for your combinatory needs.
JavaScript
85
star
6

fantasy-combinators

Common combinators.
JavaScript
66
star
7

fantasy-io

IO control structure.
JavaScript
37
star
8

fantasy-maybes

Option data structure.
JavaScript
36
star
9

sweet-fantasies

sweet.js macros for Fantasy Land compatible structures.
JavaScript
34
star
10

fantasy-laws

Property-based tests for FL-compatible ADTs
JavaScript
33
star
11

fantasy-monoids

A collection of monoids
JavaScript
28
star
12

fantasy-frees

Free monad
JavaScript
25
star
13

fantasy-readers

Reader control structure.
JavaScript
24
star
14

fantasy-eithers

Either data structure.
JavaScript
21
star
15

fantasy-identities

Identity data structure.
JavaScript
20
star
16

fantasy-sorcery

JavaScript
19
star
17

fantasy-check

QuickCheck Library using Fantasy-Land
JavaScript
18
star
18

fantasy-states

State control structure.
JavaScript
16
star
19

fantasy-examples

Example uses of Fantasy Land projects.
JavaScript
15
star
20

fantasy-tuples

Tuple data structures.
JavaScript
15
star
21

ECMAScript-proposals

Meta repository for discussions regarding ECMAScript proposals
12
star
22

fantasy-writers

Writer control structure.
JavaScript
10
star
23

fantasy-helpers

Helper functions
JavaScript
7
star
24

fantasy-validations

Validation data structure.
JavaScript
6
star
25

fantasy-stores

Store control structure.
JavaScript
5
star
26

unified-specification

Temporary repository for unified static-land and fantasy-land specification
5
star
27

function-prototype-map

4
star
28

fantasy-profunctors

Profunctor
JavaScript
3
star
29

fantasy-these

Data type isomorphic to α ∨ β ∨ (α ∧ β)
JavaScript
3
star
30

fantasy-equality

Library to enable equality of different types.
JavaScript
2
star
31

fantasy-consts

JavaScript
2
star
32

fantasy-cofrees

Cofree comonad structure.
JavaScript
2
star
33

fantasy-coproducts

Coproducts
JavaScript
2
star