[Javascript] Either Functor

Either Functor:

// API

Right(val) // resolve the value

Left(val) // return error message

 

Examples:

map(function(x) { return x + 1; }, Right(2))
//=> Right(3)

map(function(x) { return x + 1; }, Left(‘some message))
//=> Left(‘some message’)
var determineAge = function(user){
  return user.age ? Right(user.age) : Left("couldn’t get age");
}
var yearOlder = compose(map(add(1)), determineAge)

yearOlder({age: 22})
//=> Right(23)

yearOlder({age: null})
//=> Left("couldn’t get age")

 

var _ = R;
var P = PointFree;
var map = P.fmap;
var compose = P.compose;
var Maybe = P.Maybe;
var Identity = P.Id;

var Either = folktale.data.Either;
var Left = Either.Left;
var Right = Either.Right;


// Exercise 1
// ==========
// Write a function that uses checkActive() and showWelcome() to grant access or return the error
console.log("--------Start exercise 1--------")

var showWelcome = compose(_.add( "Welcome "), _.get('name'))

var checkActive = function(user) {
 return user.active ? Right(user) : Left('Your account is not active')
}

var ex1 = compose(map(showWelcome), checkActive);

assertDeepEqual(Left('Your account is not active'), ex1({active: false, name: 'Gary'}))
assertDeepEqual(Right('Welcome Theresa'), ex1({active: true, name: 'Theresa'}))
console.log("exercise 1...ok!")



// Exercise 2
// ==========
// Write a validation function that checks for a length > 3. It should return Right(x) if it is greater than 3 and Left("You need > 3") otherwise
console.log("--------Start exercise 2--------")

var ex2 = function(x) {
  if(x){
    return x.length > 3 ? 
        Right(x) : 
        Left("You need > 3");
  }else{
    return Left("You need > 3");
  }
}


assertDeepEqual(Right("fpguy99"), ex2("fpguy99"))
assertDeepEqual(Left("You need > 3"), ex2("..."))
console.log("exercise 2...ok!")





// Exercise 3
// ==========
// Use ex2 above and Either as a functor to save the user if they are valid

var save = function(x){ console.log("SAVED USER!"); return x; }

var ex3 = compose( map(save), ex2)

console.log("--------Start exercise 3--------")
assertDeepEqual(Right("fpguy99"), ex3("fpguy99"))
assertDeepEqual(Left("You need > 3"), ex3("duh"))
console.log("exercise 3...ok!")

 

posted @ 2016-09-08 03:26  Zhentiw  阅读(343)  评论(0编辑  收藏  举报