3.1.1 • Published 6 years ago

adt-maybe v3.1.1

Weekly downloads
3
License
MIT
Repository
github
Last release
6 years ago

adt-maybe

Function based Maybe algebraic data type for safe code

npm install adt-maybe

Examples

Applicative

const { safeFunc, safeNum } = require('adt-maybe/Maybe/safe');
const ap = require('adt-maybe/Maybe/operators/ap');
const caseDo = require('adt-maybe/Maybe/runner/case-do');
const pipe = require('adt-maybe/Helpers/pipe');

// mAdd2 :: Maybe (Number -> Number -> Number)
const mAdd2 = safeFunc(a => b => a + b);

// All data provided are numbers
pipe(
  ap(safeNum(4)),
  ap(safeNum(3)),
  caseDo({
    Just: x => x,
    Nothing: () => 0
  })
)(mAdd2); // => 7

// One piece of data is a string "4"
pipe(
  ap(safeNum("4")),
  ap(safeNum(3)),
  caseDo({
    Just: x => x,
    Nothing: () => 0
  })
)(mAdd2); // => 0

With safe objects

const caseDo = require('adt-maybe/Maybe/runner/case-do');
const safeMap = require('adt-maybe/Maybe/operators/safe-map');
const safeObj = require('adt-maybe/Maybe/safe/safe-obj');
const { pipe } = require('adt-maybe/Helpers');

// safeJonSnow :: Maybe Person
const safeJonSnow = safeObj({
  id: 1,
  name: {
    first: 'Jon',
    last: 'Snow'
  },
  knows: ['nothing']
});

// safeNobody :: Maybe Person
const safeNoOne = safeObj({
  id: 2,
  knows: ['Javascript']
});

// getLastNameLower :: Person -> String
const getLastNameLower = pipe(
  person => person.name.last,
  lastName => lastName.toLowerCase()
);

// getLastName :: Maybe Person -> String
const getLastName = pipe(
  safeMap(getLastNameLower),
  caseDo({
    Just: lastName => lastName,
    Nothing: () => 'no one'
  })
);

getLastName(safeJonSnow); // => 'snow'
getLastName(safeNoOne); // => 'no one'

Using pipe Kleisli

const { safeObj, safeStr } = require('adt-maybe/Maybe/safe');
const pipeK = require('adt-maybe/Helpers/pipe-k');
const parseJSON = require('adt-maybe/Maybe/factory/parse-json');
const caseDo = require('adt-maybe/Maybe/runner/case-do');

// maybeFirstName :: Maybe String
const maybeFirstName = pipeK(
  parseJSON,
  person => safeObj(person.name),
  name => safeStr(name.first)
)("{\"name\":{\"first\":\"Spock\"}}");

const cases = {
  Just(firstName) {
    return firstName.toUpperCase();
  },
  Nothing() {
  
  }
};

caseDo(cases)(getLastName); // => 'SPOCK'
3.1.1

6 years ago

3.1.0

6 years ago

3.0.0

6 years ago

2.2.2

6 years ago

2.2.1

6 years ago

2.2.0

6 years ago

2.1.0

6 years ago

2.0.0

6 years ago

1.2.1

6 years ago

1.2.0

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.0

6 years ago