DEV Community

Alessandro Maclaine
Alessandro Maclaine

Posted on • Updated on

Exploring Option Constructors in Effect-TS

Handling Optional Values with Effect-TS

In functional programming, handling optional values safely and concisely is crucial. The Option type in Effect-TS provides a robust way to work with values that may or may not be present. This article explores various constructors provided by Effect-TS to create and manipulate Option types.

What is an Option?

An Option type represents a value that may or may not exist. It encapsulates an optional value with two possible states:

  • Some(value): Represents a value that exists.
  • None: Represents the absence of a value.

Option Constructors in Effect-TS

Effect-TS offers several constructors to create Option types from different contexts. Below are some practical examples:

Example 1: Creating an Option with a Value

The O.some function wraps a value into an Option, indicating that the value is present.

import { Option as O } from 'effect';
function constructors_ex01() {
  const some = O.some(1); // Create an Option containing the value 1
  console.log(some); // Output: Some(1)
}
Enter fullscreen mode Exit fullscreen mode

Example 2: Creating an Option with No Value

The O.none function creates an Option that represents the absence of a value.

import { Option as O } from 'effect';
function constructors_ex02() {
  const none = O.none(); // Create an Option representing no value
  console.log(none); // Output: None
}
Enter fullscreen mode Exit fullscreen mode

Example 3: Creating an Option from a Nullable Value

The O.fromNullable function converts a nullable value (null or undefined) into an Option.

import { Option as O } from 'effect';
function constructors_ex03() {
  const some = O.fromNullable(1); // Create an Option containing the value 1
  const none = O.fromNullable(null); // Create an Option representing no value
  const none2 = O.fromNullable(undefined); // Create an Option representing no value
  console.log(some); // Output: Some(1)
  console.log(none); // Output: None
  console.log(none2); // Output: None
}
Enter fullscreen mode Exit fullscreen mode

Example 4: Creating an Option from an Iterable

The O.fromIterable function creates an Option from an iterable collection, returning the first value if the collection is not empty.

import { Option as O } from 'effect';
function constructors_ex04() {
  const some = O.fromIterable([1]); // Create an Option containing the first value of the array [1]
  const some2 = O.fromIterable([1, 2, 3]); // Create an Option containing the first value of the array [1, 2, 3]
  const none = O.fromIterable([]); // Create an Option representing no value from an empty array
  console.log(some); // Output: Some(1)
  console.log(some2); // Output: Some(1)
  console.log(none); // Output: None
}
Enter fullscreen mode Exit fullscreen mode

Example 5: Lifting a Nullable Function into an Option

The O.liftNullable function converts a function that may return a nullable value into a function that returns an Option.

import { Option as O, pipe } from 'effect';
function constructors_ex05() {
  const some = pipe(() => 1, O.liftNullable)(); // Create an Option containing the value 1
  const none = pipe(() => null, O.liftNullable)(); // Create an Option representing no value
  console.log(some); // Output: Some(1)
  console.log(none); // Output: None
}
Enter fullscreen mode Exit fullscreen mode

Example 6: Lifting a Throwable Function into an Option

The O.liftThrowable function converts a function that may throw an error into a function that returns an Option.

import { Option as O, pipe } from 'effect';
function constructors_ex06() {
  const some = pipe(() => 1, O.liftThrowable)(); // Create an Option containing the value 1
  const none = pipe(() => {
    throw new Error('none');
  }, O.liftThrowable)(); // Create an Option representing no value due to an error
  console.log(some); // Output: Some(1)
  console.log(none); // Output: None
}
Enter fullscreen mode Exit fullscreen mode

Additional Examples

Example 7: Lifting a Complex Nullable Function

Here’s a more complex example using O.liftNullable with a function that parses a string into a number.

import { Option as O } from 'effect';

function constructors_ex07() {
  const parseNumber = O.liftNullable((s: string) => {
    const n = parseInt(s, 10);
    return isNaN(n) ? null : n; // Return null if parsing fails, otherwise return the number
  });

  const some = parseNumber('123'); // Create an Option containing the parsed number 123
  const none = parseNumber('abc'); // Create an Option representing no value due to parsing failure
  console.log(some); // Output: Some(123)
  console.log(none); // Output: None
}
Enter fullscreen mode Exit fullscreen mode

Example 8: Lifting a Throwable Function for JSON Parsing

Using O.liftThrowable, we can handle functions that might throw errors, such as JSON parsing.

import { Option as O } from 'effect';

function constructors_ex08() {
  const parse = O.liftThrowable(JSON.parse);
  const some = parse('{"key": "value"}'); // Create an Option containing the parsed JSON object
  const none = parse('invalid json'); // Create an Option representing no value due to JSON parsing error
  console.log(some); // Output: Some({ key: 'value' })
  console.log(none); // Output: None
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

The Option type in Effect-TS provides a powerful way to handle optional values in a type-safe and expressive manner. By leveraging the various constructors, you can create and manipulate Option types effectively, ensuring that your code handles the presence or absence of values gracefully. While this approach may increase verbosity, the benefits in terms of reliability, safety, and maintainability are well worth it, especially for complex and high-value software systems. Moreover, this style of programming

Top comments (0)