[JS Compose] Enforce a null check with composable code branching using Either

來源:互聯網
上載者:User

標籤:first   int   called   his   sage   using   function   chain   ret   

We define the Either type and see how it works. Then try it out to enforce a null check and branch our code.

 

Now, we try to make Box more useful. We want to do a force null check by define "Right" and "Left" tow boxes.

 

What "Right" does is, apply the logic passed in to the value Box has.

What "Left" does is, ingore the logic and just return the value.

const Right = x => ({  map: f => Right(f(x)),
toString: () => `Right(${x})`});const Left = x => ({ map: f => Left(x),
toString: () => `Left(${x})`});

 

Example:

const res1 = Right(3).map(x => x + 1).map(x => x / 2);console.log(res1.toString()); // Right(2)const res2 = Left(3).map(x => x + 1).map(x => x / 2);console.log(res2.toString()); // Left(3)

 

The logic here we try to complete, is the function either call "Right" or "Left". To see a more useful case, we need to define our ‘fold‘ function.

const Right = x => ({  map: f => Right(f(x)),  fold: (f, g) => g(x), // If Right, run function g  toString: () => `Right(${x})` });const Left = x => ({  map: f => Left(x),  fold: (f, g) => f(x), // If Left, run function f  toString: () => `Left(${x})`});

Because in real case, we never know it is Right or Left get called, so in fold function, we defined two params, if it is Right get called, we will call second param g, if it is Left get called, we will call first param f.

 

How how about we build a function to find color, if the color is defined, we return its value, if not, we return "No color"!

const findNullable = x =>  x != null ? Right(x) : Left(null);  const findColor = name =>   findNullable({red: "#ff0000", green: "#00ff00", blue: "#0000ff"}[name]);const res = findColor("blue")  .map(s => s.slice(1))  .fold(e => "no color found", s => s.toUpperCase());console.log(res) //0000FF
const res = findColor("yellow")  .map(s => s.slice(1))  .fold(e => "no color found", s => s.toUpperCase());console.log(res); // no color found

Now, if the color is found, then it log out the color value, if not found, then show the error message.

 

So let‘s think about it,  what if we doesn‘t wrap findColor function into Box? For example, it looks like this:

const findColor = name =>   {red: "#ff0000", green: "#00ff00", blue: "#0000ff"}[name];

Then we do:

const findColor = name =>   {red: "#ff0000", green: "#00ff00", blue: "#0000ff"}[name];const res = findColor("yellow").slice(1).toUpperCase(); console.log(res); // Error: cannot call .slice() on Undefined!

 

So the benefits we get from Right and Left is it help us do null checking. If it is Left, then it will skip all the map chain. Therefore we can keep our program safe.

[JS Compose] Enforce a null check with composable code branching using Either

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.