DEV Community

Alessandro Maclaine
Alessandro Maclaine

Posted on

Using do Notation in Effect-TS Optionals

Effect-TS provides a powerful way to handle operations within the Option context using the do notation. This article explores how to sequence multiple operations with do notation and demonstrates various scenarios through examples.

Example 1: Basic Sequencing and Filtering

In this example, we bind values within the Option context, compute a sum, and filter based on a condition.

import { Option as O, pipe } from 'effect';

function do_ex01() {
  const result = pipe(
    O.Do,
    O.bind('x', () => O.some(2)), // Bind x to the value 2 wrapped in Some
    O.bind('y', () => O.some(3)), // Bind y to the value 3 wrapped in Some
    O.let('sum', ({ x, y }) => x + y), // Let sum be the sum of x and y
    O.filter(({ x, y }) => x * y > 5) // Filter the result if x * y > 5
  );
  console.log(result); // Output: Some({ x: 2, y: 3, sum: 5 }) (since 2 * 3 > 5)
}
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • Binding Values: We bind x to 2 and y to 3, both wrapped in Some.
  • Computing Sum: We compute sum as the sum of x and y.
  • Filtering: We filter the result based on the condition x * y > 5.

The output is Some({ x: 2, y: 3, sum: 5 }) because the condition 2 * 3 > 5 is met.

Example 2: Filtering with a Failing Condition

This example shows that if the filter condition fails, the result is None.

function do_ex02() {
  const result = pipe(
    O.Do,
    O.bind('x', () => O.some(1)), // Bind x to the value 1 wrapped in Some
    O.bind('y', () => O.some(2)), // Bind y to the value 2 wrapped in Some
    O.let('sum', ({ x, y }) => x + y), // Let sum be the sum of x and y
    O.filter(({ x, y }) => x * y > 5) // Filter the result if x * y > 5
  );
  console.log(result); // Output: None (since 1 * 2 <= 5)
}
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • Binding Values: We bind x to 1 and y to 2.
  • Computing Sum: We compute sum as the sum of x and y.
  • Filtering: We filter the result based on the condition x * y > 5.

The output is None because the condition 1 * 2 <= 5 fails.

Example 3: Binding with None

This example demonstrates that if any binding is None, the result is None.

function do_ex03() {
  const result = pipe(
    O.Do,
    O.bind('x', () => O.some(2)), // Bind x to the value 2 wrapped in Some
    O.bind('y', () => O.none()), // Bind y to None
    O.let('sum', ({ x, y }) => x + y), // This line won't execute since y is None
    O.filter(({ x, y }) => x * y > 5) // This line won't execute since y is None
  );
  console.log(result); // Output: None (since y is `None`)
}
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • Binding Values: We bind x to 2 and y to None.
  • Skipping Computation and Filtering: Since y is None, the subsequent operations are skipped.

The output is None because one of the bindings (y) isNone`.

Summary

The do notation in Effect-TS allows for elegant and readable sequencing of operations within the Option context. By binding values, letting computed values, and filtering based on conditions, we can handle complex optional logic in a straightforward manner. The examples above illustrate how the result changes based on different conditions and the presence of None.

Top comments (0)