DEV Community

Alessandro Maclaine
Alessandro Maclaine

Posted on

Understanding Option Sequencing in Effect-TS

Example 1: Ignoring the First Value with O.andThen

Concept

The O.andThen function allows you to execute a sequence of two Options, where the result is determined solely by the second Option. This is useful when the first Option serves a purpose, but its value isn't needed in subsequent operations.

Code

function sequencing_ex01() {
  const some1 = O.some(1); // Create an Option containing the value 1
  const some2 = O.some(2); // Create an Option containing the value 2
  const none = O.none(); // Create an Option representing no value

  console.log(pipe(some1, O.andThen(some2))); // Output: Some(2) (ignores 1 and returns 2)
  console.log(pipe(none, O.andThen(some2))); // Output: None (since the first Option is None)
}
Enter fullscreen mode Exit fullscreen mode

Explanation

  • pipe(some1, O.andThen(some2)): Here, some1 holds the value 1, but the operation ignores it and returns some2, which holds 2.
  • pipe(none, O.andThen(some2)): Since the first Option is None, the operation short-circuits and returns None.

This sequencing operation is particularly useful when you want to chain operations but are only interested in the outcome of the second operation.

Example 2: Flattening Nested Options with O.flatten

Concept

The O.flatten function is designed to handle nested Options by removing one level of nesting. This is useful when your operations result in an Option of Option, and you need to simplify it into a single Option.

Code

function sequencing_ex02() {
  const nestedSome = O.some(O.some(1)); // Create a nested Option containing the value 1
  const nestedNone = O.some(O.none()); // Create a nested Option representing no value
  const none = O.none(); // Create an Option representing no value

  console.log(pipe(nestedSome, O.flatten)); // Output: Some(1) (flattens the nested Option)
  console.log(pipe(nestedNone, O.flatten)); // Output: None (flattens to None)
  console.log(pipe(none, O.flatten)); // Output: None (since the outer Option is None)
}
Enter fullscreen mode Exit fullscreen mode

Explanation

  • pipe(nestedSome, O.flatten): This flattens the Option of Option into a single Option, resulting in Some(1).
  • pipe(nestedNone, O.flatten): The inner Option is None, so flattening results in None.
  • pipe(none, O.flatten): If the outer Option is None, flattening has no effect, and None is returned.

Flattening is essential when dealing with functions that may return nested Options, allowing you to streamline the result into a single Option value.

Example 3: Composing Option-returning Functions with O.composeK

Concept

The O.composeK function allows you to compose two functions that return an Option, creating a pipeline where the output of the first function is fed into the second. This is particularly useful for chaining operations that may fail and result in None.

Code

function sequencing_ex03() {
  const parseNumber = (s: string): O.Option<number> => {
    const n = parseInt(s, 10);
    return isNaN(n) ? O.none() : O.some(n);
  };

  const doubleIfPositive = (n: number): O.Option<number> =>
    n > 0 ? O.some(n * 2) : O.none();

  const parseAndDouble = pipe(parseNumber, O.composeK(doubleIfPositive));

  console.log(parseAndDouble('42')); // Output: Some(84) (parses and doubles the number)
  console.log(parseAndDouble('-1')); // Output: None (since -1 is not positive)
  console.log(parseAndDouble('abc')); // Output: None (since 'abc' is not a number)
}
Enter fullscreen mode Exit fullscreen mode

Explanation

  • parseAndDouble('42'): The string '42' is successfully parsed to a number, and since it’s positive, it’s doubled, resulting in Some(84).
  • parseAndDouble('-1'): The string '-1' is parsed, but since it’s negative, the function returns None.
  • parseAndDouble('abc'): The string 'abc' cannot be parsed as a number, so the function returns None.

Composing Option-returning functions allows you to create complex chains of operations while safely handling cases where any step in the chain may fail.

Conclusion

These examples showcase the versatility and power of the Option type in Effect-TS for handling sequences of operations. Whether you're ignoring values with O.andThen, flattening nested Options with O.flatten, or composing operations with O.composeK, these patterns enable you to manage optional values more effectively in a functional programming context. By leveraging these techniques, you can write more robust and concise code, ensuring that operations gracefully handle the absence of values while maintaining clear and readable logic.

Top comments (0)