DEV Community

Discussion on: We don't need a ternary operator

 
qm3ster profile image
Mihail Malo

The problem with this is that both orderCountText and noOrderCountText will be evaluated in either case.
Do they have to be functions?

Thread Thread
 
joelnet profile image
JavaScript Joel

The problem with this is that both orderCountText and noOrderCountText will be evaluated in either case.

only one function will execute in this case, either the if case or the else case, but never both.

In my version of ifElse, they can be values that will be returned or functions to be executed.

Thread Thread
 
qm3ster profile image
Mihail Malo

Yeah, whereas in condition ? expensiveGet() + 1 : expensiveGet2() - 1 only one expression will be evaluated.

Thread Thread
 
joelnet profile image
JavaScript Joel

Same with ifElse

Thread Thread
 
joelnet profile image
JavaScript Joel • Edited
const expensiveGetPlus = x => y => expensiveGet(y) + x

ifElse (condition) (expensiveGetPlus (1)) (expensiveGetPlus (-1)) (true)
Thread Thread
 
joelnet profile image
JavaScript Joel

Check out Sanctuary's ifElse sanctuary.js.org. You can live edit their page to see how it works.

I'd love to get some live editing docs page for my stuff too. Pretty neat site.

Thread Thread
 
qm3ster profile image
Mihail Malo

I see it's actually for threading through the value, just like tap:

S.ifElse(x=>typeof x === "number")(x=>x-1)(x=>x+"a")(3)
 2

S.ifElse(x=>typeof x === "number")(x=>x-1)(x=>x+"a")("banana")
 "bananaa"

However, for normal conditional use it's error prone, as you've shown in your code. Both expensive gets will run before the condition is even applied to true.
The actual code would be

const expensiveGetPlus = x => () => expensiveGet() + x
const expensiveGet2Plus = x => () => expensiveGet2() + x

ifElse (condition) (expensiveGetPlus (1)) (expensiveGet2Plus (-1)) (true)
Thread Thread
 
joelnet profile image
JavaScript Joel

That's correct, ifElse accepts functions. So those functions are only executed when the condition is met.

Thread Thread
 
joelnet profile image
JavaScript Joel

Both expensive gets will run before the condition is even applied to true.

This is still false. Only one will run. Never both.

const isEven = n => n % === 0
const logEven = n => console.log(`${n} is Even!`)
const logOdd = n => console.log(`${n} is Odd`)

ifElse (isEven) (logEven) (logOdd) (10)

//=> "10 is Even!"

You can see logOdd is never called.

Thread Thread
 
qm3ster profile image
Mihail Malo

In your first example

const expensiveGetPlus = x => expensiveGet() + x

ifElse (condition) (expensiveGetPlus (1)) (expensiveGetPlus (-1)) (true)

both run.

const expensiveGet = () => {
  console.log("doing expensive get")
  return 2
}
Thread Thread
 
joelnet profile image
JavaScript Joel

Yes you are correct. The expensiveGet method needs to take 2 arguments for it to work the way it is being called in ifElse.

I have created a working example that you can run.

const S = require('sanctuary')

const expensiveGet = (y) => {
  console.log("doing expensive get for", y)
  return 2
}
const condition = x => x === 100
const expensiveGetPlus = x => y =>
  expensiveGet(y) + x

S.ifElse (condition) (expensiveGetPlus (1))
  (expensiveGetPlus (-1)) (100)
//=> "doing expensive get for 100"

This example will show that ifElse only executes one of the functions.