Getting Started with Micro
The Micro
module in Effect is designed as a lighter alternative to the standard Effect
module, tailored for situations where it is beneficial to reduce the bundle size.
This module is standalone and does not include more complex functionalities such as Layer
, Ref
, Queue
, and Deferred
. This feature set makes Micro especially suitable for libraries that wish to utilize Effect functionalities while keeping the bundle size to a minimum, particularly for those aiming to provide Promise
-based APIs.
Micro also supports use cases where a client application uses Micro, and a server employs the full suite of Effect features, maintaining both compatibility and logical consistency across various application components.
Integrating Micro adds a minimal footprint to your bundle, starting at 5kb gzipped, which may increase depending on the features you use.
Before you start, make sure you have completed the following setup:
Install the effect
library in your project. If it is not already installed, you can add it using npm with the following command:
npm install effect
pnpm add effect
yarn add effect
bun add effect
Micro is a component of the Effect library and can be imported similarly to any other module in your TypeScript project:
import * as Micro from "effect/Micro"
This import statement allows you to access all functionalities of Micro, enabling you to use its features in your application.
The Micro
type uses three type parameters:
Micro<Success, Error, Requirements>
which mirror those of the Effect
type:
- Success. Represents the type of value that an effect can succeed with when executed.
If this type parameter is
void
, it means the effect produces no useful information, while if it isnever
, it means the effect runs forever (or until failure). - Error. Represents the expected errors that can occur when executing an effect.
If this type parameter is
never
, it means the effect cannot fail, because there are no values of typenever
. - Requirements. Represents the contextual data required by the effect to be executed.
This data is stored in a collection named
Context
. If this type parameter isnever
, it means the effect has no requirements and theContext
collection is empty.
The MicroExit
type is designed to capture the outcome of a Micro
computation. It uses the Either data type to distinguish between successful outcomes and failures:
type MicroExit<A, E = never> = Either<A, MicroCause<E>>
The MicroCause
type represents the possible causes of an effect’s failure.
MicroCause
consists of three specific types:
type MicroCause<E> = Die | Fail<E> | Interrupt
Failure Type | Description |
---|---|
Die | Indicates an unforeseen defect that wasn’t planned for in the system’s logic. |
Fail<E> | Covers anticipated errors that are recognized and typically handled within the application. |
Interrupt | Signifies an operation that has been purposefully stopped. |
In this tutorial, we’ll demonstrate how to wrap a Promise-based API using the Micro
library from Effect. We’ll use a simple example where we interact with a hypothetical weather forecasting API. The goal is to encapsulate the asynchronous API call within Micro’s structured error handling and execution flow.
Step 1: Create a Promise-based API Function
First, let’s define a simple Promise-based function that simulates fetching weather data from an external service.
1function function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city: string): interface Promise<T>
Represents the completion of an asynchronous operation
Promise<string> {2 return new var Promise: PromiseConstructor
new <string>(executor: (resolve: (value: string | PromiseLike<string>) => void, reject: (reason?: any) => void) => void) => Promise<string>
Creates a new Promise.
Promise(((parameter) resolve: (value: string | PromiseLike<string>) => void
resolve, (parameter) reject: (reason?: any) => void
reject) => {3 function setTimeout<[]>(callback: () => void, ms?: number): NodeJS.Timeout (+1 overload)
namespace setTimeout
Schedules execution of a one-time `callback` after `delay` milliseconds.
The `callback` will likely not be invoked in precisely `delay` milliseconds.
Node.js makes no guarantees about the exact timing of when callbacks will fire,
nor of their ordering. The callback will be called as close as possible to the
time specified.
When `delay` is larger than `2147483647` or less than `1`, the `delay` will be set to `1`. Non-integer delays are truncated to an integer.
If `callback` is not a function, a `TypeError` will be thrown.
This method has a custom variant for promises that is available using `timersPromises.setTimeout()`.
setTimeout(() => {4 if ((parameter) city: string
city === "London") {5 (parameter) resolve: (value: string | PromiseLike<string>) => void
resolve("Sunny")6 } else {7 (parameter) reject: (reason?: any) => void
reject(new var Error: ErrorConstructor
new (message?: string) => Error
Error("Weather data not found for this location"))8 }9 }, 1_000)10 })11}
Step 2: Wrap the Promise with Micro
Next, we’ll wrap our fetchWeather
function using Micro to handle both successful and failed Promise outcomes.
1import * as import Micro
Micro from "effect/Micro"2
3function function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city: string): interface Promise<T>
Represents the completion of an asynchronous operation
Promise<string> {4 return new var Promise: PromiseConstructor
new <string>(executor: (resolve: (value: string | PromiseLike<string>) => void, reject: (reason?: any) => void) => void) => Promise<string>
Creates a new Promise.
Promise(((parameter) resolve: (value: string | PromiseLike<string>) => void
resolve, (parameter) reject: (reason?: any) => void
reject) => {5 function setTimeout<[]>(callback: () => void, ms?: number): NodeJS.Timeout (+1 overload)
namespace setTimeout
Schedules execution of a one-time `callback` after `delay` milliseconds.
The `callback` will likely not be invoked in precisely `delay` milliseconds.
Node.js makes no guarantees about the exact timing of when callbacks will fire,
nor of their ordering. The callback will be called as close as possible to the
time specified.
When `delay` is larger than `2147483647` or less than `1`, the `delay` will be set to `1`. Non-integer delays are truncated to an integer.
If `callback` is not a function, a `TypeError` will be thrown.
This method has a custom variant for promises that is available using `timersPromises.setTimeout()`.
setTimeout(() => {6 if ((parameter) city: string
city === "London") {7 (parameter) resolve: (value: string | PromiseLike<string>) => void
resolve("Sunny")8 } else {9 (parameter) reject: (reason?: any) => void
reject(new var Error: ErrorConstructor
new (message?: string) => Error
Error("Weather data not found for this location"))10 }11 }, 1_000)12 })13}14
15function function getWeather(city: string): Micro.Micro<string, never, never>
getWeather((parameter) city: string
city: string) {16 return import Micro
Micro.const promise: <string>(evaluate: (signal: AbortSignal) => PromiseLike<string>) => Micro.Micro<string, never, never>
Wrap a `Promise` into a `Micro` effect. Any errors will result in a
`CauseDie`.
promise(() => function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city))17}
Here, Micro.promise
is used to convert the Promise returned by fetchWeather
into a Micro effect.
Step 3: Running the Micro Effect
After wrapping our function, we need to execute the Micro effect and handle the results.
1import * as import Micro
Micro from "effect/Micro"2
3function function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city: string): interface Promise<T>
Represents the completion of an asynchronous operation
Promise<string> {4 return new var Promise: PromiseConstructor
new <string>(executor: (resolve: (value: string | PromiseLike<string>) => void, reject: (reason?: any) => void) => void) => Promise<string>
Creates a new Promise.
Promise(((parameter) resolve: (value: string | PromiseLike<string>) => void
resolve, (parameter) reject: (reason?: any) => void
reject) => {5 function setTimeout<[]>(callback: () => void, ms?: number): NodeJS.Timeout (+1 overload)
namespace setTimeout
Schedules execution of a one-time `callback` after `delay` milliseconds.
The `callback` will likely not be invoked in precisely `delay` milliseconds.
Node.js makes no guarantees about the exact timing of when callbacks will fire,
nor of their ordering. The callback will be called as close as possible to the
time specified.
When `delay` is larger than `2147483647` or less than `1`, the `delay` will be set to `1`. Non-integer delays are truncated to an integer.
If `callback` is not a function, a `TypeError` will be thrown.
This method has a custom variant for promises that is available using `timersPromises.setTimeout()`.
setTimeout(() => {6 if ((parameter) city: string
city === "London") {7 (parameter) resolve: (value: string | PromiseLike<string>) => void
resolve("Sunny")8 } else {9 (parameter) reject: (reason?: any) => void
reject(new var Error: ErrorConstructor
new (message?: string) => Error
Error("Weather data not found for this location"))10 }11 }, 1_000)12 })13}14
15function function getWeather(city: string): Micro.Micro<string, never, never>
getWeather((parameter) city: string
city: string) {16 return import Micro
Micro.const promise: <string>(evaluate: (signal: AbortSignal) => PromiseLike<string>) => Micro.Micro<string, never, never>
Wrap a `Promise` into a `Micro` effect. Any errors will result in a
`CauseDie`.
promise(() => function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city))17}18
19const const weatherEffect: Micro.Micro<string, never, never>
weatherEffect = function getWeather(city: string): Micro.Micro<string, never, never>
getWeather("London")20
21import Micro
Micro.const runPromise: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const weatherEffect: Micro.Micro<string, never, never>
weatherEffect)22 .(method) Promise<string>.then<void, never>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(((parameter) result: string
result) => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(`The weather in London is: ${(parameter) result: string
result}`))23 .(method) Promise<void>.catch<void>(onrejected?: ((reason: any) => void | PromiseLike<void>) | null | undefined): Promise<void>
Attaches a callback for only the rejection of the Promise.
catch(((parameter) error: any
error) =>24 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.error(message?: any, ...optionalParams: any[]): void
Prints to `stderr` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const code = 5;
console.error('error #%d', code);
// Prints: error #5, to stderr
console.error('error', code);
// Prints: error 5, to stderr
```
If formatting elements (e.g. `%d`) are not found in the first string then
[`util.inspect()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilinspectobject-options) is called on each argument and the
resulting string values are concatenated. See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)
for more information.
error(`Failed to fetch weather data: ${(parameter) error: any
error.any
message}`)25 )26/*27Output:28The weather in London is: Sunny29*/
In this snippet, Micro.runPromise
is used to execute the weatherEffect
.
It converts the Micro effect back into a Promise, making it easier to integrate with other Promise-based code or simply to manage asynchronous operations in a familiar way.
You can also use Micro.runPromiseExit
to get more detailed information about the effect’s exit status:
1import * as import Micro
Micro from "effect/Micro"2
3function function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city: string): interface Promise<T>
Represents the completion of an asynchronous operation
Promise<string> {4 return new var Promise: PromiseConstructor
new <string>(executor: (resolve: (value: string | PromiseLike<string>) => void, reject: (reason?: any) => void) => void) => Promise<string>
Creates a new Promise.
Promise(((parameter) resolve: (value: string | PromiseLike<string>) => void
resolve, (parameter) reject: (reason?: any) => void
reject) => {5 function setTimeout<[]>(callback: () => void, ms?: number): NodeJS.Timeout (+1 overload)
namespace setTimeout
Schedules execution of a one-time `callback` after `delay` milliseconds.
The `callback` will likely not be invoked in precisely `delay` milliseconds.
Node.js makes no guarantees about the exact timing of when callbacks will fire,
nor of their ordering. The callback will be called as close as possible to the
time specified.
When `delay` is larger than `2147483647` or less than `1`, the `delay` will be set to `1`. Non-integer delays are truncated to an integer.
If `callback` is not a function, a `TypeError` will be thrown.
This method has a custom variant for promises that is available using `timersPromises.setTimeout()`.
setTimeout(() => {6 if ((parameter) city: string
city === "London") {7 (parameter) resolve: (value: string | PromiseLike<string>) => void
resolve("Sunny")8 } else {9 (parameter) reject: (reason?: any) => void
reject(new var Error: ErrorConstructor
new (message?: string) => Error
Error("Weather data not found for this location"))10 }11 }, 1_000)12 })13}14
15function function getWeather(city: string): Micro.Micro<string, never, never>
getWeather((parameter) city: string
city: string) {16 return import Micro
Micro.const promise: <string>(evaluate: (signal: AbortSignal) => PromiseLike<string>) => Micro.Micro<string, never, never>
Wrap a `Promise` into a `Micro` effect. Any errors will result in a
`CauseDie`.
promise(() => function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city))17}18
19const const weatherEffect: Micro.Micro<string, never, never>
weatherEffect = function getWeather(city: string): Micro.Micro<string, never, never>
getWeather("London")20
21import Micro
Micro.const runPromiseExit: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const weatherEffect: Micro.Micro<string, never, never>
weatherEffect).(method) Promise<MicroExit<string, never>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<string, never>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(((parameter) exit: Micro.MicroExit<string, never>
exit) => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) exit: Micro.MicroExit<string, never>
exit))22/*23Output:24{ _id: 'Either', _tag: 'Right', right: 'Sunny' }25*/
Step 4: Adding Error Handling
To further enhance the function, you might want to handle specific errors differently.
Micro provides methods like Micro.tryPromise
to handle anticipated errors gracefully.
1import * as import Micro
Micro from "effect/Micro"2
3function function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city: string): interface Promise<T>
Represents the completion of an asynchronous operation
Promise<string> {4 return new var Promise: PromiseConstructor
new <string>(executor: (resolve: (value: string | PromiseLike<string>) => void, reject: (reason?: any) => void) => void) => Promise<string>
Creates a new Promise.
Promise(((parameter) resolve: (value: string | PromiseLike<string>) => void
resolve, (parameter) reject: (reason?: any) => void
reject) => {5 function setTimeout<[]>(callback: () => void, ms?: number): NodeJS.Timeout (+1 overload)
namespace setTimeout
Schedules execution of a one-time `callback` after `delay` milliseconds.
The `callback` will likely not be invoked in precisely `delay` milliseconds.
Node.js makes no guarantees about the exact timing of when callbacks will fire,
nor of their ordering. The callback will be called as close as possible to the
time specified.
When `delay` is larger than `2147483647` or less than `1`, the `delay` will be set to `1`. Non-integer delays are truncated to an integer.
If `callback` is not a function, a `TypeError` will be thrown.
This method has a custom variant for promises that is available using `timersPromises.setTimeout()`.
setTimeout(() => {6 if ((parameter) city: string
city === "London") {7 (parameter) resolve: (value: string | PromiseLike<string>) => void
resolve("Sunny")8 } else {9 (parameter) reject: (reason?: any) => void
reject(new var Error: ErrorConstructor
new (message?: string) => Error
Error("Weather data not found for this location"))10 }11 }, 1_000)12 })13}14
15class class WeatherError
WeatherError {16 readonly (property) WeatherError._tag: "WeatherError"
_tag = "WeatherError"17 constructor(readonly (property) WeatherError.message: string
message: string) {}18}19
20function function getWeather(city: string): Micro.Micro<string, WeatherError, never>
getWeather((parameter) city: string
city: string) {21 return import Micro
Micro.const tryPromise: <string, WeatherError>(options: {
readonly try: (signal: AbortSignal) => PromiseLike<string>;
readonly catch: (error: unknown) => WeatherError;
}) => Micro.Micro<...>
Wrap a `Promise` into a `Micro` effect. Any errors will be caught and
converted into a specific error type.
tryPromise({22 (property) try: (signal: AbortSignal) => PromiseLike<string>
try: () => function fetchWeather(city: string): Promise<string>
fetchWeather((parameter) city: string
city),23 // remap the error24 (property) catch: (error: unknown) => WeatherError
catch: ((parameter) error: unknown
error) => new constructor WeatherError(message: string): WeatherError
WeatherError(var String: StringConstructor
(value?: any) => string
Allows manipulation and formatting of text strings and determination and location of substrings within strings.
String((parameter) error: unknown
error))25 })26}27
28const const weatherEffect: Micro.Micro<string, WeatherError, never>
weatherEffect = function getWeather(city: string): Micro.Micro<string, WeatherError, never>
getWeather("Paris")29
30import Micro
Micro.const runPromise: <string, WeatherError>(effect: Micro.Micro<string, WeatherError, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const weatherEffect: Micro.Micro<string, WeatherError, never>
weatherEffect)31 .(method) Promise<string>.then<void, never>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(((parameter) result: string
result) => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(`The weather in London is: ${(parameter) result: string
result}`))32 .(method) Promise<void>.catch<void>(onrejected?: ((reason: any) => void | PromiseLike<void>) | null | undefined): Promise<void>
Attaches a callback for only the rejection of the Promise.
catch(((parameter) error: any
error) =>33 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.error(message?: any, ...optionalParams: any[]): void
Prints to `stderr` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const code = 5;
console.error('error #%d', code);
// Prints: error #5, to stderr
console.error('error', code);
// Prints: error 5, to stderr
```
If formatting elements (e.g. `%d`) are not found in the first string then
[`util.inspect()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilinspectobject-options) is called on each argument and the
resulting string values are concatenated. See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)
for more information.
error(`Failed to fetch weather data: ${(parameter) error: any
error}`)34 )35/*36Output:37Failed to fetch weather data: MicroCause.Fail: {"_tag":"WeatherError","message":"Error: Weather data not found for this location"}38*/
These errors, also referred to as failures, typed errors or recoverable errors, are errors that developers anticipate as part of the normal program execution. They serve a similar purpose to checked exceptions and play a role in defining the program’s domain and control flow.
Expected errors are tracked at the type level by the Micro
data type in the “Error” channel.
The Micro.either
function transforms an Micro<A, E, R>
into an effect that encapsulates both potential failure and success within an Either data type.
The resulting effect cannot fail because the potential failure is now represented within the Either
’s Left
type.
The error type of the returned Micro
is specified as never
, confirming that the effect is structured to not fail.
By yielding an Either
, we gain the ability to “pattern match” on this type to handle both failure and success cases within the generator function:
1import * as import Either
Either from "effect/Either"2import * as import Micro
Micro from "effect/Micro"3
4class class NetworkError
NetworkError {5 readonly (property) NetworkError._tag: "NetworkError"
_tag = "NetworkError"6}7
8class class ValidationError
ValidationError {9 readonly (property) ValidationError._tag: "ValidationError"
_tag = "ValidationError"10}11
12const const task: Micro.Micro<string, NetworkError | ValidationError, never>
task = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<never, NetworkError, never>> | YieldWrap<Micro.Micro<never, ValidationError, never>>, string>(...args: [self: ...] | [body: ...]) => Micro.Micro<...>
gen(function* () {13 // Simulate network and validation errors14 if (var Math: Math
An intrinsic object that provides basic mathematics functionality and constants.
Math.(method) Math.random(): number
Returns a pseudorandom number between 0 and 1.
random() > 0.5) yield* import Micro
Micro.const fail: <NetworkError>(e: NetworkError) => Micro.Micro<never, NetworkError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor NetworkError(): NetworkError
NetworkError())15 if (var Math: Math
An intrinsic object that provides basic mathematics functionality and constants.
Math.(method) Math.random(): number
Returns a pseudorandom number between 0 and 1.
random() > 0.5) yield* import Micro
Micro.const fail: <ValidationError>(e: ValidationError) => Micro.Micro<never, ValidationError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor ValidationError(): ValidationError
ValidationError())16 return "Success"17})18
19const const recovered: Micro.Micro<string, never, never>
recovered = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<Either.Either<string, NetworkError | ValidationError>, never, never>>, string>(...args: [self: unknown, body: (this: unknown) => Generator<...>] | [body: ...]) => Micro.Micro<...>
gen(function* () {20 const const failureOrSuccess: Either.Either<string, NetworkError | ValidationError>
failureOrSuccess = yield* import Micro
Micro.const either: <string, NetworkError | ValidationError, never>(self: Micro.Micro<string, NetworkError | ValidationError, never>) => Micro.Micro<...>
Replace the success value of the given `Micro` effect with an `Either`,
wrapping the success value in `Right` and wrapping any expected errors with
a `Left`.
either(const task: Micro.Micro<string, NetworkError | ValidationError, never>
task)21 return import Either
Either.const match: <string, NetworkError | ValidationError, string, string>(self: Either.Either<string, NetworkError | ValidationError>, options: {
...;
}) => string (+1 overload)
Takes two functions and an `Either` value, if the value is a `Left` the inner value is applied to the `onLeft function,
if the value is a `Right` the inner value is applied to the `onRight` function.
match(const failureOrSuccess: Either.Either<string, NetworkError | ValidationError>
failureOrSuccess, {22 (property) onLeft: (left: NetworkError | ValidationError) => string
onLeft: ((parameter) error: NetworkError | ValidationError
error) => `Recovering from ${(parameter) error: NetworkError | ValidationError
error.(property) _tag: "NetworkError" | "ValidationError"
_tag}`,23 (property) onRight: (right: string) => string
onRight: ((parameter) value: string
value) => `Result is: ${(parameter) value: string
value}`24 })25})26
27import Micro
Micro.const runPromiseExit: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const recovered: Micro.Micro<string, never, never>
recovered).(method) Promise<MicroExit<string, never>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<string, never>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)28/*29Example Output:30{31 _id: 'Either',32 _tag: 'Right',33 right: 'Recovering from ValidationError'34}35*/
The Micro.catchAll
function allows you to catch any error that occurs in the program and provide a fallback.
1import * as import Micro
Micro from "effect/Micro"2
3class class NetworkError
NetworkError {4 readonly (property) NetworkError._tag: "NetworkError"
_tag = "NetworkError"5}6
7class class ValidationError
ValidationError {8 readonly (property) ValidationError._tag: "ValidationError"
_tag = "ValidationError"9}10
11const const task: Micro.Micro<string, NetworkError | ValidationError, never>
task = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<never, NetworkError, never>> | YieldWrap<Micro.Micro<never, ValidationError, never>>, string>(...args: [self: ...] | [body: ...]) => Micro.Micro<...>
gen(function* () {12 // Simulate network and validation errors13 if (var Math: Math
An intrinsic object that provides basic mathematics functionality and constants.
Math.(method) Math.random(): number
Returns a pseudorandom number between 0 and 1.
random() > 0.5) yield* import Micro
Micro.const fail: <NetworkError>(e: NetworkError) => Micro.Micro<never, NetworkError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor NetworkError(): NetworkError
NetworkError())14 if (var Math: Math
An intrinsic object that provides basic mathematics functionality and constants.
Math.(method) Math.random(): number
Returns a pseudorandom number between 0 and 1.
random() > 0.5) yield* import Micro
Micro.const fail: <ValidationError>(e: ValidationError) => Micro.Micro<never, ValidationError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor ValidationError(): ValidationError
ValidationError())15 return "Success"16})17
18const const recovered: Micro.Micro<string, never, never>
recovered = const task: Micro.Micro<string, NetworkError | ValidationError, never>
task.(method) Pipeable.pipe<Micro.Micro<string, NetworkError | ValidationError, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<string, NetworkError | ValidationError, never>) => Micro.Micro<...>): Micro.Micro<...> (+21 overloads)
pipe(19 import Micro
Micro.const catchAll: <NetworkError | ValidationError, string, never, never>(f: (e: NetworkError | ValidationError) => Micro.Micro<string, never, never>) => <A, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+1 overload)
Catch the error of the given `Micro` effect, allowing you to recover from it.
It only catches expected (`MicroCause.Fail`) errors.
catchAll(((parameter) error: NetworkError | ValidationError
error) =>20 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(`Recovering from ${(parameter) error: NetworkError | ValidationError
error.(property) _tag: "NetworkError" | "ValidationError"
_tag}`)21 )22)23
24import Micro
Micro.const runPromiseExit: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const recovered: Micro.Micro<string, never, never>
recovered).(method) Promise<MicroExit<string, never>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<string, never>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)25/*26Example Output:27{ _id: 'Either', _tag: 'Right', right: 'Recovering from NetworkError' }28*/
If your program’s errors are all tagged with a _tag
field that acts as a discriminator (recommended) you can use the Effect.catchTag
function to catch and handle specific errors with precision.
1import * as import Micro
Micro from "effect/Micro"2
3class class NetworkError
NetworkError {4 readonly (property) NetworkError._tag: "NetworkError"
_tag = "NetworkError"5}6
7class class ValidationError
ValidationError {8 readonly (property) ValidationError._tag: "ValidationError"
_tag = "ValidationError"9}10
11const const task: Micro.Micro<string, NetworkError | ValidationError, never>
task = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<never, NetworkError, never>> | YieldWrap<Micro.Micro<never, ValidationError, never>>, string>(...args: [self: ...] | [body: ...]) => Micro.Micro<...>
gen(function* () {12 // Simulate network and validation errors13 if (var Math: Math
An intrinsic object that provides basic mathematics functionality and constants.
Math.(method) Math.random(): number
Returns a pseudorandom number between 0 and 1.
random() > 0.5) yield* import Micro
Micro.const fail: <NetworkError>(e: NetworkError) => Micro.Micro<never, NetworkError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor NetworkError(): NetworkError
NetworkError())14 if (var Math: Math
An intrinsic object that provides basic mathematics functionality and constants.
Math.(method) Math.random(): number
Returns a pseudorandom number between 0 and 1.
random() > 0.5) yield* import Micro
Micro.const fail: <ValidationError>(e: ValidationError) => Micro.Micro<never, ValidationError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor ValidationError(): ValidationError
ValidationError())15 return "Success"16})17
18const const recovered: Micro.Micro<string, NetworkError, never>
recovered = const task: Micro.Micro<string, NetworkError | ValidationError, never>
task.(method) Pipeable.pipe<Micro.Micro<string, NetworkError | ValidationError, never>, Micro.Micro<string, NetworkError, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<...>) => Micro.Micro<...>): Micro.Micro<...> (+21 overloads)
pipe(19 import Micro
Micro.const catchTag: <"ValidationError", NetworkError | ValidationError, string, never, never>(k: "ValidationError", f: (e: ValidationError) => Micro.Micro<string, never, never>) => <A, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+1 overload)
Recovers from the specified tagged error.
catchTag("ValidationError", ((parameter) _error: ValidationError
_error) =>20 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed("Recovering from ValidationError")21 )22)23
24import Micro
Micro.const runPromiseExit: <string, NetworkError>(effect: Micro.Micro<string, NetworkError, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const recovered: Micro.Micro<string, NetworkError, never>
recovered).(method) Promise<MicroExit<string, NetworkError>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<string, NetworkError>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<...>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)25/*26Example Output:27{28 _id: 'Either',29 _tag: 'Right',30 right: 'Recovering from ValidationError'31}32*/
Unexpected errors, also referred to as defects, untyped errors, or unrecoverable errors, are errors that developers do not anticipate occurring during normal program execution. Unlike expected errors, which are considered part of a program’s domain and control flow, unexpected errors resemble unchecked exceptions and lie outside the expected behavior of the program.
Since these errors are not expected, Effect does not track them at the type level. However, the Effect runtime does keep track of these errors and provides several methods to aid in recovering from unexpected errors.
1import * as import Micro
Micro from "effect/Micro"2
3const const divide: (a: number, b: number) => Micro.Micro<number>
divide = ((parameter) a: number
a: number, (parameter) b: number
b: number): import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number> =>4 (parameter) b: number
b === 05 ? import Micro
Micro.const die: (defect: unknown) => Micro.Micro<never>
Creates a `Micro` effect that will die with the specified error.
This will result in a `CauseDie`, where the error is not tracked at
the type level.
die(new var Error: ErrorConstructor
new (message?: string) => Error
Error("Cannot divide by zero"))6 : import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed((parameter) a: number
a / (parameter) b: number
b)7
8import Micro
Micro.const runSync: <number, never>(effect: Micro.Micro<number, never, never>) => number
Attempt to execute the `Micro` effect synchronously and return the success
value.
runSync(const divide: (a: number, b: number) => Micro.Micro<number>
divide(1, 0)) // throws Error: Cannot divide by zero
1import * as import Micro
Micro from "effect/Micro"2
3const const divide: (a: number, b: number) => Micro.Micro<number, Error>
divide = ((parameter) a: number
a: number, (parameter) b: number
b: number): import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, interface Error
Error> =>4 (parameter) b: number
b === 05 ? import Micro
Micro.const fail: <Error>(e: Error) => Micro.Micro<never, Error, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new var Error: ErrorConstructor
new (message?: string) => Error
Error("Cannot divide by zero"))6 : import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed((parameter) a: number
a / (parameter) b: number
b)7
8const const program: Micro.Micro<number, never, never>
program = import Micro
Micro.const orDie: <number, Error, never>(self: Micro.Micro<number, Error, never>) => Micro.Micro<number, never, never>
Elevate any expected errors of the given `Micro` effect to unexpected errors,
resulting in an error type of `never`.
orDie(const divide: (a: number, b: number) => Micro.Micro<number, Error>
divide(1, 0))9
10import Micro
Micro.const runSync: <number, never>(effect: Micro.Micro<number, never, never>) => number
Attempt to execute the `Micro` effect synchronously and return the success
value.
runSync(const program: Micro.Micro<number, never, never>
program) // throws Error: Cannot divide by zero
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6const const program: Micro.Micro<void, never, never>
program = import Micro
Micro.const catchAllDefect: <never, never, never, void, never, never>(self: Micro.Micro<never, never, never>, f: (defect: unknown) => Micro.Micro<void, never, never>) => Micro.Micro<void, never, never> (+1 overload)
Catch any unexpected errors of the given `Micro` effect, allowing you to recover from them.
catchAllDefect(7 import Micro
Micro.const die: (defect: unknown) => Micro.Micro<never>
Creates a `Micro` effect that will die with the specified error.
This will result in a `CauseDie`, where the error is not tracked at
the type level.
die("Boom!"), // Simulating a runtime error8 ((parameter) defect: unknown
defect) => const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`Unknown defect caught: ${(parameter) defect: unknown
defect}`)9)10
11// We get an Either.Right because we caught all defects12import Micro
Micro.const runPromiseExit: <void, never>(effect: Micro.Micro<void, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const program: Micro.Micro<void, never, never>
program).(method) Promise<MicroExit<void, never>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<void, never>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)13/*14Output:15Unknown defect caught: Boom!16{ _id: 'Either', _tag: 'Right', right: undefined }17*/
The Micro.orElseSucceed
function will always replace the original failure with a success value, so the resulting effect cannot fail:
1import * as import Micro
Micro from "effect/Micro"2
3class class NegativeAgeError
NegativeAgeError {4 readonly (property) NegativeAgeError._tag: "NegativeAgeError"
_tag = "NegativeAgeError"5 constructor(readonly (property) NegativeAgeError.age: number
age: number) {}6}7
8class class IllegalAgeError
IllegalAgeError {9 readonly (property) IllegalAgeError._tag: "IllegalAgeError"
_tag = "IllegalAgeError"10 constructor(readonly (property) IllegalAgeError.age: number
age: number) {}11}12
13const const validate: (age: number) => Micro.Micro<number, NegativeAgeError | IllegalAgeError>
validate = (14 (parameter) age: number
age: number15): import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, class NegativeAgeError
NegativeAgeError | class IllegalAgeError
IllegalAgeError> => {16 if ((parameter) age: number
age < 0) {17 return import Micro
Micro.const fail: <NegativeAgeError>(e: NegativeAgeError) => Micro.Micro<never, NegativeAgeError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor NegativeAgeError(age: number): NegativeAgeError
NegativeAgeError((parameter) age: number
age))18 } else if ((parameter) age: number
age < 18) {19 return import Micro
Micro.const fail: <IllegalAgeError>(e: IllegalAgeError) => Micro.Micro<never, IllegalAgeError, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new constructor IllegalAgeError(age: number): IllegalAgeError
IllegalAgeError((parameter) age: number
age))20 } else {21 return import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed((parameter) age: number
age)22 }23}24
25const const program: Micro.Micro<number, never, never>
program = import Micro
Micro.const orElseSucceed: <number, NegativeAgeError | IllegalAgeError, never, number>(self: Micro.Micro<number, NegativeAgeError | IllegalAgeError, never>, f: LazyArg<...>) => Micro.Micro<...> (+1 overload)
Recover from all errors by succeeding with the given value.
orElseSucceed(const validate: (age: number) => Micro.Micro<number, NegativeAgeError | IllegalAgeError>
validate(3), () => 0)
1import * as import Micro
Micro from "effect/Micro"2
3const const success: Micro.Micro<number, Error, never>
success: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, interface Error
Error> = import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(42)4const const failure: Micro.Micro<number, Error, never>
failure: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, interface Error
Error> = import Micro
Micro.const fail: <Error>(e: Error) => Micro.Micro<never, Error, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(5 new var Error: ErrorConstructor
new (message?: string) => Error
Error("Uh oh!")6)7
8const const program1: Micro.Micro<string, never, never>
program1 = import Micro
Micro.const match: <number, Error, never, string, string>(self: Micro.Micro<number, Error, never>, options: {
readonly onFailure: (error: Error) => string;
readonly onSuccess: (value: number) => string;
}) => Micro.Micro<...> (+1 overload)
match(const success: Micro.Micro<number, Error, never>
success, {9 (property) onFailure: (error: Error) => string
onFailure: ((parameter) error: Error
error) => `failure: ${(parameter) error: Error
error.(property) Error.message: string
message}`,10 (property) onSuccess: (value: number) => string
onSuccess: ((parameter) value: number
value) => `success: ${(parameter) value: number
value}`11})12
13import Micro
Micro.const runPromise: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program1: Micro.Micro<string, never, never>
program1).(method) Promise<string>.then<void, never>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log) // Output: "success: 42"14
15const const program2: Micro.Micro<string, never, never>
program2 = import Micro
Micro.const match: <number, Error, never, string, string>(self: Micro.Micro<number, Error, never>, options: {
readonly onFailure: (error: Error) => string;
readonly onSuccess: (value: number) => string;
}) => Micro.Micro<...> (+1 overload)
match(const failure: Micro.Micro<number, Error, never>
failure, {16 (property) onFailure: (error: Error) => string
onFailure: ((parameter) error: Error
error) => `failure: ${(parameter) error: Error
error.(property) Error.message: string
message}`,17 (property) onSuccess: (value: number) => string
onSuccess: ((parameter) value: number
value) => `success: ${(parameter) value: number
value}`18})19
20import Micro
Micro.const runPromise: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program2: Micro.Micro<string, never, never>
program2).(method) Promise<string>.then<void, never>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log) // Output: "failure: Uh oh!"
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6const const success: Micro.Micro<number, Error, never>
success: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, interface Error
Error> = import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(42)7const const failure: Micro.Micro<number, Error, never>
failure: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, interface Error
Error> = import Micro
Micro.const fail: <Error>(e: Error) => Micro.Micro<never, Error, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(8 new var Error: ErrorConstructor
new (message?: string) => Error
Error("Uh oh!")9)10
11const const program1: Micro.Micro<string, never, never>
program1 = import Micro
Micro.const matchEffect: <number, Error, never, string, never, never, string, never, never>(self: Micro.Micro<number, Error, never>, options: {
readonly onFailure: (e: Error) => Micro.Micro<string, never, never>;
readonly onSuccess: (a: number) => Micro.Micro<...>;
}) => Micro.Micro<...> (+1 overload)
matchEffect(const success: Micro.Micro<number, Error, never>
success, {12 (property) onFailure: (e: Error) => Micro.Micro<string, never, never>
onFailure: ((parameter) error: Error
error) =>13 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(`failure: ${(parameter) error: Error
error.(property) Error.message: string
message}`).(method) Pipeable.pipe<Micro.Micro<string, never, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<string, never, never>) => Micro.Micro<string, never, never>): Micro.Micro<...> (+21 overloads)
pipe(14 import Micro
Micro.const tap: <string, Micro.Micro<void, never, never>>(f: (a: string) => Micro.Micro<void, never, never>) => <E, R>(self: Micro.Micro<string, E, R>) => Micro.Micro<string, E, R> (+3 overloads)
Execute a side effect from the success value of the `Micro` effect.
It is similar to the `andThen` api, but the success value is ignored.
tap(const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog)15 ),16 (property) onSuccess: (a: number) => Micro.Micro<string, never, never>
onSuccess: ((parameter) value: number
value) =>17 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(`success: ${(parameter) value: number
value}`).(method) Pipeable.pipe<Micro.Micro<string, never, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<string, never, never>) => Micro.Micro<string, never, never>): Micro.Micro<...> (+21 overloads)
pipe(import Micro
Micro.const tap: <string, Micro.Micro<void, never, never>>(f: (a: string) => Micro.Micro<void, never, never>) => <E, R>(self: Micro.Micro<string, E, R>) => Micro.Micro<string, E, R> (+3 overloads)
Execute a side effect from the success value of the `Micro` effect.
It is similar to the `andThen` api, but the success value is ignored.
tap(const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog))18})19
20import Micro
Micro.const runSync: <string, never>(effect: Micro.Micro<string, never, never>) => string
Attempt to execute the `Micro` effect synchronously and return the success
value.
runSync(const program1: Micro.Micro<string, never, never>
program1)21/*22Output:23success: 4224*/25
26const const program2: Micro.Micro<string, never, never>
program2 = import Micro
Micro.const matchEffect: <number, Error, never, string, never, never, string, never, never>(self: Micro.Micro<number, Error, never>, options: {
readonly onFailure: (e: Error) => Micro.Micro<string, never, never>;
readonly onSuccess: (a: number) => Micro.Micro<...>;
}) => Micro.Micro<...> (+1 overload)
matchEffect(const failure: Micro.Micro<number, Error, never>
failure, {27 (property) onFailure: (e: Error) => Micro.Micro<string, never, never>
onFailure: ((parameter) error: Error
error) =>28 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(`failure: ${(parameter) error: Error
error.(property) Error.message: string
message}`).(method) Pipeable.pipe<Micro.Micro<string, never, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<string, never, never>) => Micro.Micro<string, never, never>): Micro.Micro<...> (+21 overloads)
pipe(29 import Micro
Micro.const tap: <string, Micro.Micro<void, never, never>>(f: (a: string) => Micro.Micro<void, never, never>) => <E, R>(self: Micro.Micro<string, E, R>) => Micro.Micro<string, E, R> (+3 overloads)
Execute a side effect from the success value of the `Micro` effect.
It is similar to the `andThen` api, but the success value is ignored.
tap(const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog)30 ),31 (property) onSuccess: (a: number) => Micro.Micro<string, never, never>
onSuccess: ((parameter) value: number
value) =>32 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(`success: ${(parameter) value: number
value}`).(method) Pipeable.pipe<Micro.Micro<string, never, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<string, never, never>) => Micro.Micro<string, never, never>): Micro.Micro<...> (+21 overloads)
pipe(import Micro
Micro.const tap: <string, Micro.Micro<void, never, never>>(f: (a: string) => Micro.Micro<void, never, never>) => <E, R>(self: Micro.Micro<string, E, R>) => Micro.Micro<string, E, R> (+3 overloads)
Execute a side effect from the success value of the `Micro` effect.
It is similar to the `andThen` api, but the success value is ignored.
tap(const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog))33})34
35import Micro
Micro.const runSync: <string, never>(effect: Micro.Micro<string, never, never>) => string
Attempt to execute the `Micro` effect synchronously and return the success
value.
runSync(const program2: Micro.Micro<string, never, never>
program2)36/*37Output:38failure: Uh oh!39*/
1import * as import Micro
Micro from "effect/Micro"2
3declare const const exceptionalEffect: Micro.Micro<void, Error, never>
exceptionalEffect: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<void, interface Error
Error>4
5const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>6 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))7
8const const program: Micro.Micro<void, never, never>
program = import Micro
Micro.const matchCauseEffect: <void, Error, never, void, never, never, void, never, never>(self: Micro.Micro<void, Error, never>, options: {
readonly onFailure: (cause: Micro.MicroCause<Error>) => Micro.Micro<...>;
readonly onSuccess: (a: void) => Micro.Micro<...>;
}) => Micro.Micro<...> (+1 overload)
matchCauseEffect(const exceptionalEffect: Micro.Micro<void, Error, never>
exceptionalEffect, {9 (property) onFailure: (cause: Micro.MicroCause<Error>) => Micro.Micro<void, never, never>
onFailure: ((parameter) cause: Micro.MicroCause<Error>
cause) => {10 switch ((parameter) cause: Micro.MicroCause<Error>
cause.(property) MicroCause<E>.Proto<Tag extends string, E>._tag: "Die" | "Interrupt" | "Fail"
_tag) {11 case "Fail":12 return const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`Fail: ${(parameter) cause: Micro.MicroCause.Fail<Error>
cause.(property) MicroCause<E>.Fail<Error>.error: Error
error.(property) Error.message: string
message}`)13 case "Die":14 return const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`Die: ${(parameter) cause: Micro.MicroCause.Die
cause.(property) MicroCause<E>.Die.defect: unknown
defect}`)15 case "Interrupt":16 return const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog("interrupted!")17 }18 },19 (property) onSuccess: (a: void) => Micro.Micro<void, never, never>
onSuccess: ((parameter) value: void
value) => const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`succeeded with ${(parameter) value: void
value} value`)20})
To demonstrate the functionality of the Micro.retry
function, we will be working with the following helper that simulates an effect with possible failures:
1import * as import Micro
Micro from "effect/Micro"2
3let let count: number
count = 04
5// Simulates an effect with possible failures6const const effect: Micro.Micro<string, Error, never>
effect = import Micro
Micro.const async: <string, Error, never>(register: (resume: (effect: Micro.Micro<string, Error, never>) => void, signal: AbortSignal) => void | Micro.Micro<void, never, never>) => Micro.Micro<...>
Create a `Micro` effect from an asynchronous computation.
You can return a cleanup effect that will be run when the effect is aborted.
It is also passed an `AbortSignal` that is triggered when the effect is
aborted.
async<string, interface Error
Error>(((parameter) resume: (effect: Micro.Micro<string, Error, never>) => void
resume) => {7 if (let count: number
count <= 2) {8 let count: number
count++9 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("failure")10 (parameter) resume: (effect: Micro.Micro<string, Error, never>) => void
resume(import Micro
Micro.const fail: <Error>(e: Error) => Micro.Micro<never, Error, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new var Error: ErrorConstructor
new (message?: string) => Error
Error()))11 } else {12 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("success")13 (parameter) resume: (effect: Micro.Micro<string, Error, never>) => void
resume(import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed("yay!"))14 }15})
1import * as import Micro
Micro from "effect/Micro"2
3let let count: number
count = 04
5// Simulates an effect with possible failures6const const effect: Micro.Micro<string, Error, never>
effect = import Micro
Micro.const async: <string, Error, never>(register: (resume: (effect: Micro.Micro<string, Error, never>) => void, signal: AbortSignal) => void | Micro.Micro<void, never, never>) => Micro.Micro<...>
Create a `Micro` effect from an asynchronous computation.
You can return a cleanup effect that will be run when the effect is aborted.
It is also passed an `AbortSignal` that is triggered when the effect is
aborted.
async<string, interface Error
Error>(((parameter) resume: (effect: Micro.Micro<string, Error, never>) => void
resume) => {7 if (let count: number
count <= 2) {8 let count: number
count++9 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("failure")10 (parameter) resume: (effect: Micro.Micro<string, Error, never>) => void
resume(import Micro
Micro.const fail: <Error>(e: Error) => Micro.Micro<never, Error, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail(new var Error: ErrorConstructor
new (message?: string) => Error
Error()))11 } else {12 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("success")13 (parameter) resume: (effect: Micro.Micro<string, Error, never>) => void
resume(import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed("yay!"))14 }15})16
17// Define a repetition policy using a spaced delay between retries18const const policy: Micro.MicroSchedule
policy = import Micro
Micro.const scheduleSpaced: (millis: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will generate a constant delay.
scheduleSpaced(100)19
20const const repeated: Micro.Micro<string, Error, never>
repeated = import Micro
Micro.const retry: <string, Error, never>(self: Micro.Micro<string, Error, never>, options?: {
while?: Predicate<Error> | undefined;
times?: number | undefined;
schedule?: Micro.MicroSchedule | undefined;
} | undefined) => Micro.Micro<...> (+1 overload)
Retry the given `Micro` effect using the provided options.
retry(const effect: Micro.Micro<string, Error, never>
effect, { (property) schedule?: Micro.MicroSchedule | undefined
schedule: const policy: Micro.MicroSchedule
policy })21
22import Micro
Micro.const runPromise: <string, Error>(effect: Micro.Micro<string, Error, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const repeated: Micro.Micro<string, Error, never>
repeated).(method) Promise<string>.then<void, never>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)23/*24Output:25failure26failure27failure28success29yay!30*/
The Micro.sandbox
function allows you to encapsulate all the potential causes of an error in an effect.
It exposes the full MicroCause
of an effect, whether it’s due to a failure, fiber interruption, or defect.
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6const const effect: Micro.Micro<string, string, never>
effect = import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("Oh uh!").(method) Pipeable.pipe<Micro.Micro<never, string, never>, Micro.Micro<string, string, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<never, string, never>) => Micro.Micro<string, string, never>): Micro.Micro<...> (+21 overloads)
pipe(import Micro
Micro.const as: <never, string>(value: string) => <E, R>(self: Micro.Micro<never, E, R>) => Micro.Micro<string, E, R> (+1 overload)
Create a `Micro` effect that will replace the success value of the given
effect.
as("primary result"))7
8const const sandboxed: Micro.Micro<string, Micro.MicroCause<string>, never>
sandboxed = import Micro
Micro.const sandbox: <string, string, never>(self: Micro.Micro<string, string, never>) => Micro.Micro<string, Micro.MicroCause<string>, never>
Replace the error type of the given `Micro` with the full `MicroCause` object.
sandbox(const effect: Micro.Micro<string, string, never>
effect)9
10const const program: Micro.Micro<string, never, never>
program = const sandboxed: Micro.Micro<string, Micro.MicroCause<string>, never>
sandboxed.(method) Pipeable.pipe<Micro.Micro<string, Micro.MicroCause<string>, never>, Micro.Micro<string, Micro.MicroCause<E>.Die | Micro.MicroCause.Interrupt, never>, Micro.Micro<...>, Micro.Micro<...>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<...>) => Micro.Micro<...>, bc: (_: Micro.Micro<...>) => Micro.Micro<...>, cd: (_: Micro.Micro<...>) => Micro.Micro<...>): Micro.Micro<...> (+21 overloads)
pipe(11 import Micro
Micro.const catchTag: <"Fail", Micro.MicroCause<string>, string, never, never>(k: "Fail", f: (e: Micro.MicroCause<E>.Fail<string>) => Micro.Micro<string, never, never>) => <A, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+1 overload)
Recovers from the specified tagged error.
catchTag("Fail", ((parameter) cause: Micro.MicroCause.Fail<string>
cause) =>12 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`Caught a defect: ${(parameter) cause: Micro.MicroCause.Fail<string>
cause.(property) MicroCause<E>.Fail<string>.error: string
error}`).(method) Pipeable.pipe<Micro.Micro<void, never, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<void, never, never>) => Micro.Micro<string, never, never>): Micro.Micro<...> (+21 overloads)
pipe(13 import Micro
Micro.const as: <void, string>(value: string) => <E, R>(self: Micro.Micro<void, E, R>) => Micro.Micro<string, E, R> (+1 overload)
Create a `Micro` effect that will replace the success value of the given
effect.
as("fallback result on expected error")14 )15 ),16 import Micro
Micro.const catchTag: <"Interrupt", Micro.MicroCause<E>.Die | Micro.MicroCause.Interrupt, string, never, never>(k: "Interrupt", f: (e: Micro.MicroCause.Interrupt) => Micro.Micro<string, never, never>) => <A, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+1 overload)
Recovers from the specified tagged error.
catchTag("Interrupt", () =>17 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`Caught a defect`).(method) Pipeable.pipe<Micro.Micro<void, never, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<void, never, never>) => Micro.Micro<string, never, never>): Micro.Micro<...> (+21 overloads)
pipe(18 import Micro
Micro.const as: <void, string>(value: string) => <E, R>(self: Micro.Micro<void, E, R>) => Micro.Micro<string, E, R> (+1 overload)
Create a `Micro` effect that will replace the success value of the given
effect.
as("fallback result on fiber interruption")19 )20 ),21 import Micro
Micro.const catchTag: <"Die", Micro.MicroCause<E>.Die, string, never, never>(k: "Die", f: (e: Micro.MicroCause.Die) => Micro.Micro<string, never, never>) => <A, R>(self: Micro.Micro<A, Micro.MicroCause.Die, R>) => Micro.Micro<...> (+1 overload)
Recovers from the specified tagged error.
catchTag("Die", ((parameter) cause: Micro.MicroCause.Die
cause) =>22 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`Caught a defect: ${(parameter) cause: Micro.MicroCause.Die
cause.(property) MicroCause<E>.Die.defect: unknown
defect}`).(method) Pipeable.pipe<Micro.Micro<void, never, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<void, never, never>) => Micro.Micro<string, never, never>): Micro.Micro<...> (+21 overloads)
pipe(23 import Micro
Micro.const as: <void, string>(value: string) => <E, R>(self: Micro.Micro<void, E, R>) => Micro.Micro<string, E, R> (+1 overload)
Create a `Micro` effect that will replace the success value of the given
effect.
as("fallback result on unexpected error")24 )25 )26)27
28import Micro
Micro.const runPromise: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<string, never, never>
program).(method) Promise<string>.then<void, never>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)29/*30Output:31Caught a defect: Oh uh!32fallback result on expected error33*/
Executes an effectful operation to inspect the failure of an effect without altering it.
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6// Create an effect that is designed to fail, simulating an occurrence of a network error7const const task: Micro.Micro<number, string, never>
task: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, string> = import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("NetworkError")8
9// Log the error message if the task fails. This function only executes if there is an error,10// providing a method to handle or inspect errors without altering the outcome of the original effect.11const const tapping: Micro.Micro<number, string, never>
tapping = import Micro
Micro.const tapError: <number, string, never, void, never, never>(self: Micro.Micro<number, string, never>, f: (e: string) => Micro.Micro<void, never, never>) => Micro.Micro<number, string, never> (+1 overload)
Perform a side effect from expected errors of the given `Micro`.
tapError(const task: Micro.Micro<number, string, never>
task, ((parameter) error: string
error) =>12 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`expected error: ${(parameter) error: string
error}`)13)14
15import Micro
Micro.const runFork: <number, string>(effect: Micro.Micro<number, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Micro.Handle<...>
Execute the `Micro` effect and return a `Handle` that can be awaited, joined,
or aborted.
You can listen for the result by adding an observer using the handle's
`addObserver` method.
runFork(const tapping: Micro.Micro<number, string, never>
tapping)16/*17Output:18expected error: NetworkError19*/
Inspects the underlying cause of an effect’s failure.
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6// Create an effect that is designed to fail, simulating an occurrence of a network error7const const task1: Micro.Micro<number, string, never>
task1: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, string> = import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("NetworkError")8// This will log the cause of any expected error or defect9const const tapping1: Micro.Micro<number, string, never>
tapping1 = import Micro
Micro.const tapErrorCause: <number, string, never, void, never, never>(self: Micro.Micro<number, string, never>, f: (cause: Micro.MicroCause<string>) => Micro.Micro<void, never, never>) => Micro.Micro<...> (+1 overload)
Perform a side effect using the full `MicroCause` object of the given `Micro`.
tapErrorCause(const task1: Micro.Micro<number, string, never>
task1, ((parameter) cause: Micro.MicroCause<string>
cause) =>10 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`error cause: ${(parameter) cause: Micro.MicroCause<string>
cause}`)11)12
13import Micro
Micro.const runFork: <number, string>(effect: Micro.Micro<number, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Micro.Handle<...>
Execute the `Micro` effect and return a `Handle` that can be awaited, joined,
or aborted.
You can listen for the result by adding an observer using the handle's
`addObserver` method.
runFork(const tapping1: Micro.Micro<number, string, never>
tapping1)14/*15Output:16error cause: MicroCause.Fail: NetworkError17*/18
19// Simulate a severe failure in the system by causing a defect with a specific message.20const const task2: Micro.Micro<number, string, never>
task2: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, string> = import Micro
Micro.const die: (defect: unknown) => Micro.Micro<never>
Creates a `Micro` effect that will die with the specified error.
This will result in a `CauseDie`, where the error is not tracked at
the type level.
die(21 "Something went wrong"22)23
24// This will log the cause of any expected error or defect25const const tapping2: Micro.Micro<number, string, never>
tapping2 = import Micro
Micro.const tapErrorCause: <number, string, never, void, never, never>(self: Micro.Micro<number, string, never>, f: (cause: Micro.MicroCause<string>) => Micro.Micro<void, never, never>) => Micro.Micro<...> (+1 overload)
Perform a side effect using the full `MicroCause` object of the given `Micro`.
tapErrorCause(const task2: Micro.Micro<number, string, never>
task2, ((parameter) cause: Micro.MicroCause<string>
cause) =>26 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`error cause: ${(parameter) cause: Micro.MicroCause<string>
cause}`)27)28
29import Micro
Micro.const runFork: <number, string>(effect: Micro.Micro<number, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Micro.Handle<...>
Execute the `Micro` effect and return a `Handle` that can be awaited, joined,
or aborted.
You can listen for the result by adding an observer using the handle's
`addObserver` method.
runFork(const tapping2: Micro.Micro<number, string, never>
tapping2)30/*31Output:32error cause: MicroCause.Die: Something went wrong33*/
Specifically inspects non-recoverable failures or defects in an effect.
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6// Create an effect that is designed to fail, simulating an occurrence of a network error7const const task1: Micro.Micro<number, string, never>
task1: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, string> = import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("NetworkError")8
9// this won't log anything because is not a defect10const const tapping1: Micro.Micro<number, string, never>
tapping1 = import Micro
Micro.const tapDefect: <number, string, never, void, never, never>(self: Micro.Micro<number, string, never>, f: (defect: unknown) => Micro.Micro<void, never, never>) => Micro.Micro<number, string, never> (+1 overload)
Perform a side effect from unexpected errors of the given `Micro`.
tapDefect(const task1: Micro.Micro<number, string, never>
task1, ((parameter) cause: unknown
cause) =>11 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`defect: ${(parameter) cause: unknown
cause}`)12)13
14import Micro
Micro.const runFork: <number, string>(effect: Micro.Micro<number, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Micro.Handle<...>
Execute the `Micro` effect and return a `Handle` that can be awaited, joined,
or aborted.
You can listen for the result by adding an observer using the handle's
`addObserver` method.
runFork(const tapping1: Micro.Micro<number, string, never>
tapping1)15/*16No Output17*/18
19// Simulate a severe failure in the system by causing a defect with a specific message.20const const task2: Micro.Micro<number, string, never>
task2: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number, string> = import Micro
Micro.const die: (defect: unknown) => Micro.Micro<never>
Creates a `Micro` effect that will die with the specified error.
This will result in a `CauseDie`, where the error is not tracked at
the type level.
die(21 "Something went wrong"22)23
24// This will only log defects, not errors25const const tapping2: Micro.Micro<number, string, never>
tapping2 = import Micro
Micro.const tapDefect: <number, string, never, void, never, never>(self: Micro.Micro<number, string, never>, f: (defect: unknown) => Micro.Micro<void, never, never>) => Micro.Micro<number, string, never> (+1 overload)
Perform a side effect from unexpected errors of the given `Micro`.
tapDefect(const task2: Micro.Micro<number, string, never>
task2, ((parameter) cause: unknown
cause) =>26 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`defect: ${(parameter) cause: unknown
cause}`)27)28
29import Micro
Micro.const runFork: <number, string>(effect: Micro.Micro<number, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Micro.Handle<...>
Execute the `Micro` effect and return a `Handle` that can be awaited, joined,
or aborted.
You can listen for the result by adding an observer using the handle's
`addObserver` method.
runFork(const tapping2: Micro.Micro<number, string, never>
tapping2)30/*31Output:32defect: Something went wrong33*/
“Yieldable Errors” are special types of errors that can be yielded within a generator function used by Micro.gen
.
The unique feature of these errors is that you don’t need to use the Micro.fail
API explicitly to handle them.
They offer a more intuitive and convenient way to work with custom errors in your code.
1import * as import Micro
Micro from "effect/Micro"2
3class class MyError
MyError extends import Micro
Micro.const Error: new <A extends Record<string, any> = {}>(args: Equals<A, {}> extends true ? void : { readonly [P in keyof A]: A[P]; }) => Micro.YieldableError & Readonly<A>
Error<{ (property) message: string
message: string }> {}4
5export const const program: Micro.Micro<void, MyError, never>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<never, MyError, never>>, void>(...args: [self: unknown, body: (this: unknown) => Generator<YieldWrap<Micro.Micro<never, MyError, never>>, void, never>] | [body: ...]) => Micro.Micro<...>
gen(function* () {6 // same as yield* Effect.fail(new MyError({ message: "Oh no!" })7 yield* new constructor MyError<{
message: string;
}>(args: {
readonly message: string;
}): MyError
MyError({ (property) message: string
message: "Oh no!" })8})9
10import Micro
Micro.const runPromiseExit: <void, MyError>(effect: Micro.Micro<void, MyError, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const program: Micro.Micro<void, MyError, never>
program).(method) Promise<MicroExit<void, MyError>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<void, MyError>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)11/*12Output:13{14 _id: 'Either',15 _tag: 'Left',16 left: (MicroCause.Fail) Error: Oh no!17 ...stack trace...18}19*/
1import * as import Micro
Micro from "effect/Micro"2
3// An error with _tag: "Foo"4class class FooError
FooError extends import Micro
Micro.const TaggedError: <"Foo">(tag: "Foo") => new <A>(args: Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Micro.YieldableError & {
...;
} & Readonly<...>
TaggedError("Foo")<{5 (property) message: string
message: string6}> {}7
8// An error with _tag: "Bar"9class class BarError
BarError extends import Micro
Micro.const TaggedError: <"Bar">(tag: "Bar") => new <A>(args: Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Micro.YieldableError & {
...;
} & Readonly<...>
TaggedError("Bar")<{10 (property) randomNumber: number
randomNumber: number11}> {}12
13export const const program: Micro.Micro<string, never, never>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<never, FooError, never>> | YieldWrap<Micro.Micro<never, BarError, never>>, string>(...args: [self: ...] | [body: ...]) => Micro.Micro<...>
gen(function* () {14 const const n: number
n = var Math: Math
An intrinsic object that provides basic mathematics functionality and constants.
Math.(method) Math.random(): number
Returns a pseudorandom number between 0 and 1.
random()15 return const n: number
n > 0.516 ? "yay!"17 : const n: number
n < 0.218 ? yield* new constructor FooError<{
message: string;
}>(args: {
readonly message: string;
}): FooError
FooError({ (property) message: string
message: "Oh no!" })19 : yield* new constructor BarError<{
randomNumber: number;
}>(args: {
readonly randomNumber: number;
}): BarError
BarError({ (property) randomNumber: number
randomNumber: const n: number
n })20}).(method) Pipeable.pipe<Micro.Micro<string, FooError | BarError, never>, Micro.Micro<string, BarError, never>, Micro.Micro<string, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<...>) => Micro.Micro<...>, bc: (_: Micro.Micro<...>) => Micro.Micro<...>): Micro.Micro<...> (+21 overloads)
pipe(21 import Micro
Micro.const catchTag: <"Foo", FooError | BarError, string, never, never>(k: "Foo", f: (e: FooError) => Micro.Micro<string, never, never>) => <A, R>(self: Micro.Micro<A, FooError | BarError, R>) => Micro.Micro<...> (+1 overload)
Recovers from the specified tagged error.
catchTag("Foo", ((parameter) error: FooError
error) =>22 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(`Foo error: ${(parameter) error: FooError
error.(property) message: string
message}`)23 ),24 import Micro
Micro.const catchTag: <"Bar", BarError, string, never, never>(k: "Bar", f: (e: BarError) => Micro.Micro<string, never, never>) => <A, R>(self: Micro.Micro<A, BarError, R>) => Micro.Micro<...> (+1 overload)
Recovers from the specified tagged error.
catchTag("Bar", ((parameter) error: BarError
error) =>25 import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed(`Bar error: ${(parameter) error: BarError
error.(property) randomNumber: number
randomNumber}`)26 )27)28
29import Micro
Micro.const runPromise: <string, never>(effect: Micro.Micro<string, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<string, never, never>
program).(method) Promise<string>.then<void, void>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => void | PromiseLike<void>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log, namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.error(message?: any, ...optionalParams: any[]): void
Prints to `stderr` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const code = 5;
console.error('error #%d', code);
// Prints: error #5, to stderr
console.error('error', code);
// Prints: error 5, to stderr
```
If formatting elements (e.g. `%d`) are not found in the first string then
[`util.inspect()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilinspectobject-options) is called on each argument and the
resulting string values are concatenated. See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)
for more information.
error)30/*31Example Output (n < 0.2):32Foo error: Oh no!33*/
In the context of programming, a service refers to a reusable component or functionality that can be used by different parts of an application. Services are designed to provide specific capabilities and can be shared across multiple modules or components.
Services often encapsulate common tasks or operations that are needed by different parts of an application. They can handle complex operations, interact with external systems or APIs, manage data, or perform other specialized tasks.
Services are typically designed to be modular and decoupled from the rest of the application. This allows them to be easily maintained, tested, and replaced without affecting the overall functionality of the application.
To create a new service, you need two things:
- A unique identifier.
- A type describing the possible operations of the service.
1import * as import Context
Context from "effect/Context"2import * as import Micro
Micro from "effect/Micro"3
4// Define a service using a unique identifier5class class Random
Random extends import Context
Context.const Tag: <"MyRandomService">(id: "MyRandomService") => <Self, Shape>() => Context.TagClass<Self, "MyRandomService", Shape>
namespace Tag
Tag("MyRandomService")<6 class Random
Random,7 { readonly (property) next: Micro.Micro<number, never, never>
next: import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number> } // Operations8>() {}
Now that we have our service tag defined, let’s see how we can use it by building a simple program.
1import * as Context from "effect/Context"2import * as Micro from "effect/Micro"34// Define a service using a unique identifier5class Random extends Context.Tag("MyRandomService")<6 Randomconst randomNumber: number
,7 { readonly next: Micro.Micro<number> } // Operations8>() {}9// ---cut---10const program = Micro.gen(function* () {11 // Access the Random service12 const random = yield* Micro.service(Random)13
14 // Retrieve a random number from the service15 const randomNumber = yield* random.next16
17 console.log(`random number: ${randomNumber}`)18})
It’s worth noting that the type of the program
variable includes Random
in the Requirements
type parameter: Micro<void, never, Random>
.
This indicates that our program requires the Random
service to be provided in order to execute successfully.
To successfully execute the program, we need to provide an actual implementation of the Random
service.
1import * as Context from "effect/Context"2import * as Micro from const provideService: <void, never, Random, Random, {
next: Micro.Micro<number, never, never>;
}>(self: Micro.Micro<void, never, Random>, tag: Context.Tag<Random, {
next: Micro.Micro<...>;
}>, service: {
next: Micro.Micro<...>;
}) => Micro.Micro<...> (+1 overload)
Add the provided service to the current context.
"effect/Micro"34// Define a service using a unique identifier5class Random extends Context.Tag("MyRandomService")<6 Random,7 { readonly next: Micro.Micro<number> } // Operations8>() {}9
10const program = Micro.gen(function* () {11 // Access the Random service12 const random = yield* Micro.service(Random)13
14 // Retrieve a random number from the service15 const randomNumber = yield* random.next16
17 console.log(`random number: ${randomNumber}`)18})19// ---cut---20// Provide the Random service implementation21const runnable = Micro.provideService(program, Random, {22 next: Micro.sync(() => Math.random())23})24
25// Execute the program and print the random number26Micro.runPromise(runnable)27/*28Example Output:29random number: 0.824187223313441730*/
In simple terms, a MicroScope
represents the lifetime of one or more resources. When a scope is closed, the resources associated with it are guaranteed to be released.
With the MicroScope
data type, you can:
- Add finalizers, which represent the release of a resource.
- Close the scope, releasing all acquired resources and executing any added finalizers.
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6const const program: Micro.Micro<void, never, never>
program =7 // create a new scope8 import Micro
Micro.const scopeMake: Micro.Micro<Micro.MicroScope.Closeable, never, never>
scopeMake.(method) Pipeable.pipe<Micro.Micro<Micro.MicroScope.Closeable, never, never>, Micro.Micro<Micro.MicroScope.Closeable, never, never>, Micro.Micro<Micro.MicroScope.Closeable, never, never>, Micro.Micro<...>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<...>) => Micro.Micro<...>, bc: (_: Micro.Micro<...>) => Micro.Micro<...>, cd: (_: Micro.Micro<...>) => Micro.Micro<...>): Micro.Micro<...> (+21 overloads)
pipe(9 // add finalizer 110 import Micro
Micro.const tap: <Micro.MicroScope.Closeable, Micro.Micro<void, never, never>>(f: (a: Micro.MicroScope.Closeable) => Micro.Micro<void, never, never>) => <E, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+3 overloads)
Execute a side effect from the success value of the `Micro` effect.
It is similar to the `andThen` api, but the success value is ignored.
tap(((parameter) scope: Micro.MicroScope.Closeable
scope) =>11 (parameter) scope: Micro.MicroScope.Closeable
scope.(property) MicroScope.addFinalizer: (finalizer: (exit: Micro.MicroExit<unknown, unknown>) => Micro.Micro<void>) => Micro.Micro<void>
addFinalizer(() => const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog("finalizer 1"))12 ),13 // add finalizer 214 import Micro
Micro.const tap: <Micro.MicroScope.Closeable, Micro.Micro<void, never, never>>(f: (a: Micro.MicroScope.Closeable) => Micro.Micro<void, never, never>) => <E, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+3 overloads)
Execute a side effect from the success value of the `Micro` effect.
It is similar to the `andThen` api, but the success value is ignored.
tap(((parameter) scope: Micro.MicroScope.Closeable
scope) =>15 (parameter) scope: Micro.MicroScope.Closeable
scope.(property) MicroScope.addFinalizer: (finalizer: (exit: Micro.MicroExit<unknown, unknown>) => Micro.Micro<void>) => Micro.Micro<void>
addFinalizer(() => const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog("finalizer 2"))16 ),17 // close the scope18 import Micro
Micro.const andThen: <Micro.MicroScope.Closeable, Micro.Micro<void, never, never>>(f: (a: Micro.MicroScope.Closeable) => Micro.Micro<void, never, never>) => <E, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+3 overloads)
A more flexible version of `flatMap`, that combines `map` and `flatMap` into
a single api.
It also allows you to pass in a `Micro` effect directly, which will be
executed after the current effect.
andThen(((parameter) scope: Micro.MicroScope.Closeable
scope) =>19 (parameter) scope: Micro.MicroScope.Closeable
scope.(property) MicroScope.Closeable.close: (exit: Micro.MicroExit<any, any>) => Micro.Micro<void>
close(import Micro
Micro.const exitSucceed: <string>(a: string) => Micro.MicroExit<string, never>
exitSucceed("scope closed successfully"))20 )21 )22
23import Micro
Micro.const runPromise: <void, never>(effect: Micro.Micro<void, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<void, never, never>
program)24/*25Output:26finalizer 2 <-- finalizers are closed in reverse order27finalizer 128*/
By default, when a MicroScope
is closed, all finalizers added to that MicroScope
are executed in the reverse order in which they were added. This approach makes sense because releasing resources in the reverse order of acquisition ensures that resources are properly closed.
For instance, if you open a network connection and then access a file on a remote server, you must close the file before closing the network connection. This sequence is critical to maintaining the ability to interact with the remote server.
The Micro.addFinalizer
function provides a higher-level API for adding finalizers to the scope of a Micro
value.
These finalizers are guaranteed to execute when the associated scope is closed, and their behavior may depend on the MicroExit
value with which the scope is closed.
Let’s observe how things behave in the event of success:
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: string
message: string) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: string
message))5
6const const program: Micro.Micro<number, never, Micro.MicroScope>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<void, never, Micro.MicroScope>>, number>(...args: [self: unknown, body: (this: unknown) => Generator<YieldWrap<Micro.Micro<void, never, Micro.MicroScope>>, number, never>] | [body: ...]) => Micro.Micro<...>
gen(function* () {7 yield* import Micro
Micro.const addFinalizer: (finalizer: (exit: Micro.MicroExit<unknown, unknown>) => Micro.Micro<void>) => Micro.Micro<void, never, Micro.MicroScope>
Add a finalizer to the current `MicroScope`.
addFinalizer(((parameter) exit: Micro.MicroExit<unknown, unknown>
exit) =>8 const consoleLog: (message: string) => Micro.Micro<void, never, never>
consoleLog(`finalizer after ${(parameter) exit: Micro.MicroExit<unknown, unknown>
exit.(property) _tag: "Right" | "Left"
_tag}`)9 )10 return 111})12
13const const runnable: Micro.Micro<number, never, never>
runnable = import Micro
Micro.const scoped: <number, never, Micro.MicroScope>(self: Micro.Micro<number, never, Micro.MicroScope>) => Micro.Micro<number, never, never>
Provide a `MicroScope` to the given effect, closing it after the effect has
finished executing.
scoped(const program: Micro.Micro<number, never, Micro.MicroScope>
program)14
15import Micro
Micro.const runPromise: <number, never>(effect: Micro.Micro<number, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const runnable: Micro.Micro<number, never, never>
runnable).(method) Promise<number>.then<void, void>(onfulfilled?: ((value: number) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => void | PromiseLike<void>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log, namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.error(message?: any, ...optionalParams: any[]): void
Prints to `stderr` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const code = 5;
console.error('error #%d', code);
// Prints: error #5, to stderr
console.error('error', code);
// Prints: error 5, to stderr
```
If formatting elements (e.g. `%d`) are not found in the first string then
[`util.inspect()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilinspectobject-options) is called on each argument and the
resulting string values are concatenated. See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)
for more information.
error)16/*17Output:18finalizer after Right19120*/
Next, let’s explore how things behave in the event of a failure:
1import * as import Micro
Micro from "effect/Micro"2
3const const consoleLog: (message?: any, ...optionalParams: Array<any>) => Micro.Micro<void, never, never>
consoleLog = ((parameter) message: any
message?: any, ...(parameter) optionalParams: any[]
optionalParams: interface Array<T>
Array<any>) =>4 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log((parameter) message: any
message, ...(parameter) optionalParams: any[]
optionalParams))5
6const const program: Micro.Micro<never, string, Micro.MicroScope>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<never, string, never>> | YieldWrap<Micro.Micro<void, never, Micro.MicroScope>>, never>(...args: [self: unknown, body: (this: unknown) => Generator<...>] | [body: ...]) => Micro.Micro<...>
gen(function* () {7 yield* import Micro
Micro.const addFinalizer: (finalizer: (exit: Micro.MicroExit<unknown, unknown>) => Micro.Micro<void>) => Micro.Micro<void, never, Micro.MicroScope>
Add a finalizer to the current `MicroScope`.
addFinalizer(((parameter) exit: Micro.MicroExit<unknown, unknown>
exit) =>8 const consoleLog: (message?: any, ...optionalParams: Array<any>) => Micro.Micro<void, never, never>
consoleLog(`finalizer after ${(parameter) exit: Micro.MicroExit<unknown, unknown>
exit.(property) _tag: "Right" | "Left"
_tag}`)9 )10 return yield* import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("Uh oh!")11})12
13const const runnable: Micro.Micro<never, string, never>
runnable = import Micro
Micro.const scoped: <never, string, Micro.MicroScope>(self: Micro.Micro<never, string, Micro.MicroScope>) => Micro.Micro<never, string, never>
Provide a `MicroScope` to the given effect, closing it after the effect has
finished executing.
scoped(const program: Micro.Micro<never, string, Micro.MicroScope>
program)14
15import Micro
Micro.const runPromiseExit: <never, string>(effect: Micro.Micro<never, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const runnable: Micro.Micro<never, string, never>
runnable).(method) Promise<MicroExit<never, string>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<never, string>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)16/*17Output:18finalizer after Left19{ _id: 'Either', _tag: 'Left', left: MicroCause.Fail: Uh oh! }20*/
We can define a resource using operators like Micro.acquireRelease(acquire, release)
, which allows us to create a scoped value from an acquire
and release
workflow.
Every acquire release requires three actions:
- Acquiring Resource. An effect describing the acquisition of resource. For example, opening a file.
- Using Resource. An effect describing the actual process to produce a result. For example, counting the number of lines in a file.
- Releasing Resource. An effect describing the final step of releasing or cleaning up the resource. For example, closing a file.
The Micro.acquireRelease
operator performs the acquire
workflow uninterruptibly.
This is important because if we allowed interruption during resource acquisition we could be interrupted when the resource was partially acquired.
The guarantee of the Micro.acquireRelease
operator is that if the acquire
workflow successfully completes execution then the release
workflow is guaranteed to be run when the Scope
is closed.
For example, let’s define a simple resource:
1import * as import Micro
Micro from "effect/Micro"2
3// Define the interface for the resource4interface interface MyResource
MyResource {5 readonly (property) MyResource.contents: string
contents: string6 readonly (property) MyResource.close: () => Promise<void>
close: () => interface Promise<T>
Represents the completion of an asynchronous operation
Promise<void>7}8
9// Simulate getting the resource10const const getMyResource: () => Promise<MyResource>
getMyResource = (): interface Promise<T>
Represents the completion of an asynchronous operation
Promise<interface MyResource
MyResource> =>11 var Promise: PromiseConstructor
Represents the completion of an asynchronous operation
Promise.(method) PromiseConstructor.resolve<{
contents: string;
close: () => Promise<void>;
}>(value: {
contents: string;
close: () => Promise<void>;
}): Promise<{
contents: string;
close: () => Promise<void>;
}> (+2 overloads)
Creates a new resolved promise for the provided value.
resolve({12 (property) contents: string
contents: "lorem ipsum",13 (property) close: () => Promise<void>
close: () =>14 new var Promise: PromiseConstructor
new <void>(executor: (resolve: (value: void | PromiseLike<void>) => void, reject: (reason?: any) => void) => void) => Promise<void>
Creates a new Promise.
Promise(((parameter) resolve: (value: void | PromiseLike<void>) => void
resolve) => {15 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Resource released")16 (parameter) resolve: (value: void | PromiseLike<void>) => void
resolve()17 })18 })19
20// Define the acquisition of the resource with error handling21const const acquire: Micro.Micro<MyResource, Error, never>
acquire = import Micro
Micro.const tryPromise: <MyResource, Error>(options: {
readonly try: (signal: AbortSignal) => PromiseLike<MyResource>;
readonly catch: (error: unknown) => Error;
}) => Micro.Micro<...>
Wrap a `Promise` into a `Micro` effect. Any errors will be caught and
converted into a specific error type.
tryPromise({22 (property) try: (signal: AbortSignal) => PromiseLike<MyResource>
try: () =>23 const getMyResource: () => Promise<MyResource>
getMyResource().(method) Promise<MyResource>.then<MyResource, never>(onfulfilled?: ((value: MyResource) => MyResource | PromiseLike<MyResource>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<...>) | ... 1 more ... | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(((parameter) res: MyResource
res) => {24 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Resource acquired")25 return (parameter) res: MyResource
res26 }),27 (property) catch: (error: unknown) => Error
catch: () => new var Error: ErrorConstructor
new (message?: string) => Error
Error("getMyResourceError")28})29
30// Define the release of the resource31const const release: (res: MyResource) => Micro.Micro<void, never, never>
release = ((parameter) res: MyResource
res: interface MyResource
MyResource) => import Micro
Micro.const promise: <void>(evaluate: (signal: AbortSignal) => PromiseLike<void>) => Micro.Micro<void, never, never>
Wrap a `Promise` into a `Micro` effect. Any errors will result in a
`CauseDie`.
promise(() => (parameter) res: MyResource
res.(property) MyResource.close: () => Promise<void>
close())32
33const const resource: Micro.Micro<MyResource, Error, Micro.MicroScope>
resource = import Micro
Micro.const acquireRelease: <MyResource, Error, never>(acquire: Micro.Micro<MyResource, Error, never>, release: (a: MyResource, exit: Micro.MicroExit<unknown, unknown>) => Micro.Micro<void>) => Micro.Micro<...>
Create a resource with a cleanup `Micro` effect, ensuring the cleanup is
executed when the `MicroScope` is closed.
acquireRelease(const acquire: Micro.Micro<MyResource, Error, never>
acquire, const release: (res: MyResource) => Micro.Micro<void, never, never>
release)34
35const const program: Micro.Micro<void, Error, never>
program = import Micro
Micro.const scoped: <void, Error, Micro.MicroScope>(self: Micro.Micro<void, Error, Micro.MicroScope>) => Micro.Micro<void, Error, never>
Provide a `MicroScope` to the given effect, closing it after the effect has
finished executing.
scoped(36 import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<MyResource, Error, Micro.MicroScope>>, void>(...args: [self: unknown, body: (this: unknown) => Generator<YieldWrap<Micro.Micro<MyResource, Error, Micro.MicroScope>>, void, never>] | [body: ...]) => Micro.Micro<...>
gen(function* () {37 const const res: MyResource
res = yield* const resource: Micro.Micro<MyResource, Error, Micro.MicroScope>
resource38 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(`content is ${const res: MyResource
res.(property) MyResource.contents: string
contents}`)39 })40)41
42import Micro
Micro.const runPromise: <void, Error>(effect: Micro.Micro<void, Error, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<void, Error, never>
program)43/*44Resource acquired45content is lorem ipsum46Resource released47*/
The Micro.scoped
operator removes the MicroScope
from the context, indicating that there are no longer any resources used by this workflow which require a scope.
The Micro.acquireUseRelease(acquire, use, release)
function is a specialized version of the Micro.acquireRelease
function that simplifies resource management by automatically handling the scoping of resources.
The main difference is that acquireUseRelease
eliminates the need to manually call Micro.scoped
to manage the resource’s scope. It has additional knowledge about when you are done using the resource created with the acquire
step. This is achieved by providing a use
argument, which represents the function that operates on the acquired resource. As a result, acquireUseRelease
can automatically determine when it should execute the release step.
Here’s an example that demonstrates the usage of acquireUseRelease
:
1import * as import Micro
Micro from "effect/Micro"2
3// Define the interface for the resource4interface interface MyResource
MyResource {5 readonly (property) MyResource.contents: string
contents: string6 readonly (property) MyResource.close: () => Promise<void>
close: () => interface Promise<T>
Represents the completion of an asynchronous operation
Promise<void>7}8
9// Simulate getting the resource10const const getMyResource: () => Promise<MyResource>
getMyResource = (): interface Promise<T>
Represents the completion of an asynchronous operation
Promise<interface MyResource
MyResource> =>11 var Promise: PromiseConstructor
Represents the completion of an asynchronous operation
Promise.(method) PromiseConstructor.resolve<{
contents: string;
close: () => Promise<void>;
}>(value: {
contents: string;
close: () => Promise<void>;
}): Promise<{
contents: string;
close: () => Promise<void>;
}> (+2 overloads)
Creates a new resolved promise for the provided value.
resolve({12 (property) contents: string
contents: "lorem ipsum",13 (property) close: () => Promise<void>
close: () =>14 new var Promise: PromiseConstructor
new <void>(executor: (resolve: (value: void | PromiseLike<void>) => void, reject: (reason?: any) => void) => void) => Promise<void>
Creates a new Promise.
Promise(((parameter) resolve: (value: void | PromiseLike<void>) => void
resolve) => {15 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Resource released")16 (parameter) resolve: (value: void | PromiseLike<void>) => void
resolve()17 })18 })19
20// Define the acquisition of the resource with error handling21const const acquire: Micro.Micro<MyResource, Error, never>
acquire = import Micro
Micro.const tryPromise: <MyResource, Error>(options: {
readonly try: (signal: AbortSignal) => PromiseLike<MyResource>;
readonly catch: (error: unknown) => Error;
}) => Micro.Micro<...>
Wrap a `Promise` into a `Micro` effect. Any errors will be caught and
converted into a specific error type.
tryPromise({22 (property) try: (signal: AbortSignal) => PromiseLike<MyResource>
try: () =>23 const getMyResource: () => Promise<MyResource>
getMyResource().(method) Promise<MyResource>.then<MyResource, never>(onfulfilled?: ((value: MyResource) => MyResource | PromiseLike<MyResource>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<...>) | ... 1 more ... | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(((parameter) res: MyResource
res) => {24 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Resource acquired")25 return (parameter) res: MyResource
res26 }),27 (property) catch: (error: unknown) => Error
catch: () => new var Error: ErrorConstructor
new (message?: string) => Error
Error("getMyResourceError")28})29
30// Define the release of the resource31const const release: (res: MyResource) => Micro.Micro<void, never, never>
release = ((parameter) res: MyResource
res: interface MyResource
MyResource) => import Micro
Micro.const promise: <void>(evaluate: (signal: AbortSignal) => PromiseLike<void>) => Micro.Micro<void, never, never>
Wrap a `Promise` into a `Micro` effect. Any errors will result in a
`CauseDie`.
promise(() => (parameter) res: MyResource
res.(property) MyResource.close: () => Promise<void>
close())32
33const const use: (res: MyResource) => Micro.Micro<void, never, never>
use = ((parameter) res: MyResource
res: interface MyResource
MyResource) =>34 import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(`content is ${(parameter) res: MyResource
res.(property) MyResource.contents: string
contents}`))35
36const const program: Micro.Micro<void, Error, never>
program = import Micro
Micro.const acquireUseRelease: <MyResource, Error, never, void, never, never, never, never>(acquire: Micro.Micro<MyResource, Error, never>, use: (a: MyResource) => Micro.Micro<...>, release: (a: MyResource, exit: Micro.MicroExit<...>) => Micro.Micro<...>) => Micro.Micro<...>
Acquire a resource, use it, and then release the resource when the `use`
effect has completed.
acquireUseRelease(const acquire: Micro.Micro<MyResource, Error, never>
acquire, const use: (res: MyResource) => Micro.Micro<void, never, never>
use, const release: (res: MyResource) => Micro.Micro<void, never, never>
release)37
38import Micro
Micro.const runPromise: <void, Error>(effect: Micro.Micro<void, Error, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<void, Error, never>
program)39/*40Resource acquired41content is lorem ipsum42Resource released43*/
The Micro.repeat
function returns a new effect that repeats the given effect according to a specified schedule or until the first failure.
Success Example
1import * as import Micro
Micro from "effect/Micro"2
3const const action: Micro.Micro<void, never, never>
action = import Micro
Micro.const sync: <void>(evaluate: LazyArg<void>) => Micro.Micro<void, never, never>
Creates a `Micro` effect that will succeed with the lazily evaluated value.
If the evaluation of the value throws an error, the effect will fail with
`CauseDie`.
sync(() => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("success"))4
5const const policy: Micro.MicroSchedule
policy = import Micro
Micro.const scheduleAddDelay: (self: Micro.MicroSchedule, f: () => number) => Micro.MicroSchedule (+1 overload)
Returns a new `MicroSchedule` with an added calculated delay to each delay
returned by this schedule.
scheduleAddDelay(import Micro
Micro.const scheduleRecurs: (n: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will stop repeating after the specified number
of attempts.
scheduleRecurs(2), () => 100)6
7const const program: Micro.Micro<void, never, never>
program = import Micro
Micro.const repeat: <void, never, never>(self: Micro.Micro<void, never, never>, options?: {
while?: Predicate<void> | undefined;
times?: number | undefined;
schedule?: Micro.MicroSchedule | undefined;
} | undefined) => Micro.Micro<...> (+1 overload)
Repeat the given `Micro` effect using the provided options. Only successful
results will be repeated.
repeat(const action: Micro.Micro<void, never, never>
action, { (property) schedule?: Micro.MicroSchedule | undefined
schedule: const policy: Micro.MicroSchedule
policy })8
9import Micro
Micro.const runPromise: <void, never>(effect: Micro.Micro<void, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<void, never, never>
program).(method) Promise<void>.then<void, never>(onfulfilled?: ((value: void) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(((parameter) n: void
n) => namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(`repetitions: ${(parameter) n: void
n}`))10/*11Output:12success13success14success15*/
Failure Example
1import * as import Micro
Micro from "effect/Micro"2
3let let count: number
count = 04
5// Define an async effect that simulates an action with possible failures6const const action: Micro.Micro<string, string, never>
action = import Micro
Micro.const async: <string, string, never>(register: (resume: (effect: Micro.Micro<string, string, never>) => void, signal: AbortSignal) => void | Micro.Micro<void, never, never>) => Micro.Micro<...>
Create a `Micro` effect from an asynchronous computation.
You can return a cleanup effect that will be run when the effect is aborted.
It is also passed an `AbortSignal` that is triggered when the effect is
aborted.
async<string, string>(((parameter) resume: (effect: Micro.Micro<string, string, never>) => void
resume) => {7 if (let count: number
count > 1) {8 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("failure")9 (parameter) resume: (effect: Micro.Micro<string, string, never>) => void
resume(import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("Uh oh!"))10 } else {11 let count: number
count++12 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("success")13 (parameter) resume: (effect: Micro.Micro<string, string, never>) => void
resume(import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed("yay!"))14 }15})16
17const const policy: Micro.MicroSchedule
policy = import Micro
Micro.const scheduleAddDelay: (self: Micro.MicroSchedule, f: () => number) => Micro.MicroSchedule (+1 overload)
Returns a new `MicroSchedule` with an added calculated delay to each delay
returned by this schedule.
scheduleAddDelay(import Micro
Micro.const scheduleRecurs: (n: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will stop repeating after the specified number
of attempts.
scheduleRecurs(2), () => 100)18
19const const program: Micro.Micro<string, string, never>
program = import Micro
Micro.const repeat: <string, string, never>(self: Micro.Micro<string, string, never>, options?: {
while?: Predicate<string> | undefined;
times?: number | undefined;
schedule?: Micro.MicroSchedule | undefined;
} | undefined) => Micro.Micro<...> (+1 overload)
Repeat the given `Micro` effect using the provided options. Only successful
results will be repeated.
repeat(const action: Micro.Micro<string, string, never>
action, { (property) schedule?: Micro.MicroSchedule | undefined
schedule: const policy: Micro.MicroSchedule
policy })20
21import Micro
Micro.const runPromiseExit: <string, string>(effect: Micro.Micro<string, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const program: Micro.Micro<string, string, never>
program).(method) Promise<MicroExit<string, string>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<string, string>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)22/*23Output:24success25success26failure27{ _id: 'Either', _tag: 'Left', left: MicroCause.Fail: Uh oh! }28*/
To demonstrate the functionality of different schedules, we will be working with the following helper:
1import type * as import Micro
Micro from "effect/Micro"2import * as import Option
Option from "effect/Option"3
4const const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun = (5 (parameter) schedule: Micro.MicroSchedule
schedule: import Micro
Micro.type MicroSchedule = (attempt: number, elapsed: number) => Option.Option<number>
The `MicroSchedule` type represents a function that can be used to calculate
the delay between repeats.
The function takes the current attempt number and the elapsed time since the
first attempt, and returns the delay for the next attempt. If the function
returns `None`, the repetition will stop.
MicroSchedule,6 (parameter) maxAttempt: number
maxAttempt: number = 77): interface Array<T>
Array<number> => {8 let let attempt: number
attempt = 19 let let elapsed: number
elapsed = 010 let let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)11 const const out: number[]
out: interface Array<T>
Array<number> = []12 while (import Option
Option.const isSome: <number>(self: Option.Option<number>) => self is Option.Some<number>
Determine if a `Option` is a `Some`.
isSome(let duration: Option.Option<number>
duration) && let attempt: number
attempt <= (parameter) maxAttempt: number
maxAttempt) {13 const const value: number
value = let duration: Option.Some<number>
duration.(property) Some<number>.value: number
value14 let attempt: number
attempt++15 let elapsed: number
elapsed += const value: number
value16 const out: number[]
out.(method) Array<number>.push(...items: number[]): number
Appends new elements to the end of an array, and returns the new length of the array.
push(const value: number
value)17 let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)18 }19 return const out: number[]
out20}
A schedule that recurs continuously, each repetition spaced the specified duration from the last run.
1import * as import Micro
Micro from "effect/Micro"2import * as import Option
Option from "effect/Option"3
17 collapsed lines
4const const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun = (5 (parameter) schedule: Micro.MicroSchedule
schedule: import Micro
Micro.type MicroSchedule = (attempt: number, elapsed: number) => Option.Option<number>
The `MicroSchedule` type represents a function that can be used to calculate
the delay between repeats.
The function takes the current attempt number and the elapsed time since the
first attempt, and returns the delay for the next attempt. If the function
returns `None`, the repetition will stop.
MicroSchedule,6 (parameter) maxAttempt: number
maxAttempt: number = 77): interface Array<T>
Array<number> => {8 let let attempt: number
attempt = 19 let let elapsed: number
elapsed = 010 let let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)11 const const out: number[]
out: interface Array<T>
Array<number> = []12 while (import Option
Option.const isSome: <number>(self: Option.Option<number>) => self is Option.Some<number>
Determine if a `Option` is a `Some`.
isSome(let duration: Option.Option<number>
duration) && let attempt: number
attempt <= (parameter) maxAttempt: number
maxAttempt) {13 const const value: number
value = let duration: Option.Some<number>
duration.(property) Some<number>.value: number
value14 let attempt: number
attempt++15 let elapsed: number
elapsed += const value: number
value16 const out: number[]
out.(method) Array<number>.push(...items: number[]): number
Appends new elements to the end of an array, and returns the new length of the array.
push(const value: number
value)17 let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)18 }19 return const out: number[]
out20}21
22const const policy: Micro.MicroSchedule
policy = import Micro
Micro.const scheduleSpaced: (millis: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will generate a constant delay.
scheduleSpaced(10)23
24namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun(const policy: Micro.MicroSchedule
policy))25/*26Output:27[28 10, 10, 10, 10,29 10, 10, 1030]31*/
A schedule that recurs using exponential backoff.
1import * as import Micro
Micro from "effect/Micro"2import * as import Option
Option from "effect/Option"3
17 collapsed lines
4const const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun = (5 (parameter) schedule: Micro.MicroSchedule
schedule: import Micro
Micro.type MicroSchedule = (attempt: number, elapsed: number) => Option.Option<number>
The `MicroSchedule` type represents a function that can be used to calculate
the delay between repeats.
The function takes the current attempt number and the elapsed time since the
first attempt, and returns the delay for the next attempt. If the function
returns `None`, the repetition will stop.
MicroSchedule,6 (parameter) maxAttempt: number
maxAttempt: number = 77): interface Array<T>
Array<number> => {8 let let attempt: number
attempt = 19 let let elapsed: number
elapsed = 010 let let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)11 const const out: number[]
out: interface Array<T>
Array<number> = []12 while (import Option
Option.const isSome: <number>(self: Option.Option<number>) => self is Option.Some<number>
Determine if a `Option` is a `Some`.
isSome(let duration: Option.Option<number>
duration) && let attempt: number
attempt <= (parameter) maxAttempt: number
maxAttempt) {13 const const value: number
value = let duration: Option.Some<number>
duration.(property) Some<number>.value: number
value14 let attempt: number
attempt++15 let elapsed: number
elapsed += const value: number
value16 const out: number[]
out.(method) Array<number>.push(...items: number[]): number
Appends new elements to the end of an array, and returns the new length of the array.
push(const value: number
value)17 let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)18 }19 return const out: number[]
out20}21
22const const policy: Micro.MicroSchedule
policy = import Micro
Micro.const scheduleExponential: (baseMillis: number, factor?: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will generate a delay with an exponential backoff.
scheduleExponential(10)23
24namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun(const policy: Micro.MicroSchedule
policy))25/*26Output:27[28 20, 40, 80,29 160, 320, 640,30 128031]32*/
Combines two schedules through union, by recurring if either schedule wants to recur, using the minimum of the two delays between recurrences.
1import * as import Micro
Micro from "effect/Micro"2import * as import Option
Option from "effect/Option"3
17 collapsed lines
4const const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun = (5 (parameter) schedule: Micro.MicroSchedule
schedule: import Micro
Micro.type MicroSchedule = (attempt: number, elapsed: number) => Option.Option<number>
The `MicroSchedule` type represents a function that can be used to calculate
the delay between repeats.
The function takes the current attempt number and the elapsed time since the
first attempt, and returns the delay for the next attempt. If the function
returns `None`, the repetition will stop.
MicroSchedule,6 (parameter) maxAttempt: number
maxAttempt: number = 77): interface Array<T>
Array<number> => {8 let let attempt: number
attempt = 19 let let elapsed: number
elapsed = 010 let let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)11 const const out: number[]
out: interface Array<T>
Array<number> = []12 while (import Option
Option.const isSome: <number>(self: Option.Option<number>) => self is Option.Some<number>
Determine if a `Option` is a `Some`.
isSome(let duration: Option.Option<number>
duration) && let attempt: number
attempt <= (parameter) maxAttempt: number
maxAttempt) {13 const const value: number
value = let duration: Option.Some<number>
duration.(property) Some<number>.value: number
value14 let attempt: number
attempt++15 let elapsed: number
elapsed += const value: number
value16 const out: number[]
out.(method) Array<number>.push(...items: number[]): number
Appends new elements to the end of an array, and returns the new length of the array.
push(const value: number
value)17 let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)18 }19 return const out: number[]
out20}21
22const const policy: Micro.MicroSchedule
policy = import Micro
Micro.const scheduleUnion: (self: Micro.MicroSchedule, that: Micro.MicroSchedule) => Micro.MicroSchedule (+1 overload)
Combines two `MicroSchedule`s, by recurring if either schedule wants to
recur, using the minimum of the two durations between recurrences.
scheduleUnion(23 import Micro
Micro.const scheduleExponential: (baseMillis: number, factor?: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will generate a delay with an exponential backoff.
scheduleExponential(10),24 import Micro
Micro.const scheduleSpaced: (millis: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will generate a constant delay.
scheduleSpaced(300)25)26
27namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun(const policy: Micro.MicroSchedule
policy))28/*29Output:30[31 20, < exponential32 40,33 80,34 160,35 300, < spaced36 300,37 30038]39*/
Combines two schedules through the intersection, by recurring only if both schedules want to recur, using the maximum of the two delays between recurrences.
1import * as import Micro
Micro from "effect/Micro"2import * as import Option
Option from "effect/Option"3
17 collapsed lines
4const const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun = (5 (parameter) schedule: Micro.MicroSchedule
schedule: import Micro
Micro.type MicroSchedule = (attempt: number, elapsed: number) => Option.Option<number>
The `MicroSchedule` type represents a function that can be used to calculate
the delay between repeats.
The function takes the current attempt number and the elapsed time since the
first attempt, and returns the delay for the next attempt. If the function
returns `None`, the repetition will stop.
MicroSchedule,6 (parameter) maxAttempt: number
maxAttempt: number = 77): interface Array<T>
Array<number> => {8 let let attempt: number
attempt = 19 let let elapsed: number
elapsed = 010 let let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)11 const const out: number[]
out: interface Array<T>
Array<number> = []12 while (import Option
Option.const isSome: <number>(self: Option.Option<number>) => self is Option.Some<number>
Determine if a `Option` is a `Some`.
isSome(let duration: Option.Option<number>
duration) && let attempt: number
attempt <= (parameter) maxAttempt: number
maxAttempt) {13 const const value: number
value = let duration: Option.Some<number>
duration.(property) Some<number>.value: number
value14 let attempt: number
attempt++15 let elapsed: number
elapsed += const value: number
value16 const out: number[]
out.(method) Array<number>.push(...items: number[]): number
Appends new elements to the end of an array, and returns the new length of the array.
push(const value: number
value)17 let duration: Option.Option<number>
duration = (parameter) schedule: (attempt: number, elapsed: number) => Option.Option<number>
schedule(let attempt: number
attempt, let elapsed: number
elapsed)18 }19 return const out: number[]
out20}21
22const const policy: Micro.MicroSchedule
policy = import Micro
Micro.const scheduleIntersect: (self: Micro.MicroSchedule, that: Micro.MicroSchedule) => Micro.MicroSchedule (+1 overload)
Combines two `MicroSchedule`s, by recurring only if both schedules want to
recur, using the maximum of the two durations between recurrences.
scheduleIntersect(23 import Micro
Micro.const scheduleExponential: (baseMillis: number, factor?: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will generate a delay with an exponential backoff.
scheduleExponential(10),24 import Micro
Micro.const scheduleSpaced: (millis: number) => Micro.MicroSchedule
Create a `MicroSchedule` that will generate a constant delay.
scheduleSpaced(300)25)26
27namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(const dryRun: (schedule: Micro.MicroSchedule, maxAttempt?: number) => Array<number>
dryRun(const policy: Micro.MicroSchedule
policy))28/*29Output:30[31 300, < spaced32 300,33 300,34 300,35 320, < exponential36 640,37 128038]39*/
One of the fundamental ways to create a fiber is by forking an existing effect. When you fork an effect, it starts executing the effect on a new fiber, giving you a reference to this newly-created fiber.
The following code demonstrates how to create a single fiber using the Micro.fork
function. This fiber will execute the function fib(100)
independently of the main fiber:
1import * as import Micro
Micro from "effect/Micro"2
3const const fib: (n: number) => Micro.Micro<number>
fib = ((parameter) n: number
n: number): import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number> =>4 import Micro
Micro.const suspend: <number, never, never>(evaluate: LazyArg<Micro.Micro<number, never, never>>) => Micro.Micro<number, never, never>
Lazily creates a `Micro` effect from the given side-effect.
suspend(() => {5 if ((parameter) n: number
n <= 1) {6 return import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed((parameter) n: number
n)7 }8 return const fib: (n: number) => Micro.Micro<number>
fib((parameter) n: number
n - 1).(method) Pipeable.pipe<Micro.Micro<number, never, never>, Micro.Micro<number, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<number, never, never>) => Micro.Micro<number, never, never>): Micro.Micro<...> (+21 overloads)
pipe(import Micro
Micro.const zipWith: <number, never, never, number, number>(that: Micro.Micro<number, never, never>, f: (a: number, b: number) => number, options?: {
readonly concurrent?: boolean | undefined;
}) => <E, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+1 overload)
The `Micro.zipWith` function combines two `Micro` effects and allows you to
apply a function to the results of the combined effects, transforming them
into a single value.
zipWith(const fib: (n: number) => Micro.Micro<number>
fib((parameter) n: number
n - 2), ((parameter) a: number
a, (parameter) b: number
b) => (parameter) a: number
a + (parameter) b: number
b))9 })10
11const const fib10Fiber: Micro.Micro<Micro.Handle<number, never>, never, never>
fib10Fiber = import Micro
Micro.const fork: <number, never, never>(self: Micro.Micro<number, never, never>) => Micro.Micro<Micro.Handle<number, never>, never, never>
Run the `Micro` effect in a new `Handle` that can be awaited, joined, or
aborted.
When the parent `Micro` finishes, this `Micro` will be aborted.
fork(const fib: (n: number) => Micro.Micro<number>
fib(10))
A common operation with fibers is joining them using the .join
property.
This property returns a Micro
that will succeed or fail based on the outcome of the fiber it joins:
1import * as import Micro
Micro from "effect/Micro"2
3const const fib: (n: number) => Micro.Micro<number>
fib = ((parameter) n: number
n: number): import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number> =>4 import Micro
Micro.const suspend: <number, never, never>(evaluate: LazyArg<Micro.Micro<number, never, never>>) => Micro.Micro<number, never, never>
Lazily creates a `Micro` effect from the given side-effect.
suspend(() => {5 if ((parameter) n: number
n <= 1) {6 return import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed((parameter) n: number
n)7 }8 return const fib: (n: number) => Micro.Micro<number>
fib((parameter) n: number
n - 1).(method) Pipeable.pipe<Micro.Micro<number, never, never>, Micro.Micro<number, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<number, never, never>) => Micro.Micro<number, never, never>): Micro.Micro<...> (+21 overloads)
pipe(import Micro
Micro.const zipWith: <number, never, never, number, number>(that: Micro.Micro<number, never, never>, f: (a: number, b: number) => number, options?: {
readonly concurrent?: boolean | undefined;
}) => <E, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+1 overload)
The `Micro.zipWith` function combines two `Micro` effects and allows you to
apply a function to the results of the combined effects, transforming them
into a single value.
zipWith(const fib: (n: number) => Micro.Micro<number>
fib((parameter) n: number
n - 2), ((parameter) a: number
a, (parameter) b: number
b) => (parameter) a: number
a + (parameter) b: number
b))9 })10
11const const fib10Fiber: Micro.Micro<Micro.Handle<number, never>, never, never>
fib10Fiber = import Micro
Micro.const fork: <number, never, never>(self: Micro.Micro<number, never, never>) => Micro.Micro<Micro.Handle<number, never>, never, never>
Run the `Micro` effect in a new `Handle` that can be awaited, joined, or
aborted.
When the parent `Micro` finishes, this `Micro` will be aborted.
fork(const fib: (n: number) => Micro.Micro<number>
fib(10))12
13const const program: Micro.Micro<void, never, never>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<Micro.Handle<number, never>, never, never>> | YieldWrap<Micro.Micro<number, never, never>>, void>(...args: [self: ...] | [body: ...]) => Micro.Micro<...>
gen(function* () {14 const const fiber: Micro.Handle<number, never>
fiber = yield* const fib10Fiber: Micro.Micro<Micro.Handle<number, never>, never, never>
fib10Fiber15 const const n: number
n = yield* const fiber: Micro.Handle<number, never>
fiber.(property) Handle<number, never>.join: Micro.Micro<number, never, never>
join16 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(const n: number
n)17})18
19import Micro
Micro.const runPromise: <void, never>(effect: Micro.Micro<void, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<void, never, never>
program) // 55
Another useful property for fibers is .await
.
This property returns an effect containing a MicroExit
value, which provides detailed information about how the fiber completed.
1import * as import Micro
Micro from "effect/Micro"2
3const const fib: (n: number) => Micro.Micro<number>
fib = ((parameter) n: number
n: number): import Micro
Micro.interface Micro<out A, out E = never, out R = never>
namespace Micro
A lightweight alternative to the `Effect` data type, with a subset of the functionality.
Micro<number> =>4 import Micro
Micro.const suspend: <number, never, never>(evaluate: LazyArg<Micro.Micro<number, never, never>>) => Micro.Micro<number, never, never>
Lazily creates a `Micro` effect from the given side-effect.
suspend(() => {5 if ((parameter) n: number
n <= 1) {6 return import Micro
Micro.const succeed: <number>(a: number) => Micro.Micro<number, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed((parameter) n: number
n)7 }8 return const fib: (n: number) => Micro.Micro<number>
fib((parameter) n: number
n - 1).(method) Pipeable.pipe<Micro.Micro<number, never, never>, Micro.Micro<number, never, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<number, never, never>) => Micro.Micro<number, never, never>): Micro.Micro<...> (+21 overloads)
pipe(import Micro
Micro.const zipWith: <number, never, never, number, number>(that: Micro.Micro<number, never, never>, f: (a: number, b: number) => number, options?: {
readonly concurrent?: boolean | undefined;
}) => <E, R>(self: Micro.Micro<...>) => Micro.Micro<...> (+1 overload)
The `Micro.zipWith` function combines two `Micro` effects and allows you to
apply a function to the results of the combined effects, transforming them
into a single value.
zipWith(const fib: (n: number) => Micro.Micro<number>
fib((parameter) n: number
n - 2), ((parameter) a: number
a, (parameter) b: number
b) => (parameter) a: number
a + (parameter) b: number
b))9 })10
11const const fib10Fiber: Micro.Micro<Micro.Handle<number, never>, never, never>
fib10Fiber = import Micro
Micro.const fork: <number, never, never>(self: Micro.Micro<number, never, never>) => Micro.Micro<Micro.Handle<number, never>, never, never>
Run the `Micro` effect in a new `Handle` that can be awaited, joined, or
aborted.
When the parent `Micro` finishes, this `Micro` will be aborted.
fork(const fib: (n: number) => Micro.Micro<number>
fib(10))12
13const const program: Micro.Micro<void, never, never>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<Micro.Handle<number, never>, never, never>> | YieldWrap<Micro.Micro<Micro.MicroExit<number, never>, never, never>>, void>(...args: [self: ...] | [body: ...]) => Micro.Micro<...>
gen(function* () {14 const const fiber: Micro.Handle<number, never>
fiber = yield* const fib10Fiber: Micro.Micro<Micro.Handle<number, never>, never, never>
fib10Fiber15 const const exit: Micro.MicroExit<number, never>
exit = yield* const fiber: Micro.Handle<number, never>
fiber.(property) Handle<number, never>.await: Micro.Micro<Micro.MicroExit<number, never>, never, never>
await16 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(const exit: Micro.MicroExit<number, never>
exit)17})18
19import Micro
Micro.const runPromise: <void, never>(effect: Micro.Micro<void, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<void, never, never>
program) // { _id: 'Either', _tag: 'Right', right: 55 }
If a fiber’s result is no longer needed, it can be interrupted, which immediately terminates the fiber and safely releases all resources by running all finalizers.
Similar to .await
, .interrupt
returns a MicroExit
value describing how the fiber completed.
1import * as import Micro
Micro from "effect/Micro"2
3const const program: Micro.Micro<void, never, never>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<Micro.Handle<never, never>, never, never>> | YieldWrap<Micro.Micro<Micro.MicroExit<never, never>, never, never>>, void>(...args: [self: ...] | [body: ...]) => Micro.Micro<...>
gen(function* () {4 const const fiber: Micro.Handle<never, never>
fiber = yield* import Micro
Micro.const fork: <never, never, never>(self: Micro.Micro<never, never, never>) => Micro.Micro<Micro.Handle<never, never>, never, never>
Run the `Micro` effect in a new `Handle` that can be awaited, joined, or
aborted.
When the parent `Micro` finishes, this `Micro` will be aborted.
fork(import Micro
Micro.const forever: <string, never, never>(self: Micro.Micro<string, never, never>) => Micro.Micro<never, never, never>
Repeat the given `Micro` effect forever, only stopping if the effect fails.
forever(import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed("Hi!")))5 const const exit: Micro.MicroExit<never, never>
exit = yield* const fiber: Micro.Handle<never, never>
fiber.(property) Handle<never, never>.interrupt: Micro.Micro<Micro.MicroExit<never, never>, never, never>
interrupt6 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(const exit: Micro.MicroExit<never, never>
exit)7})8
9import Micro
Micro.const runPromise: <void, never>(effect: Micro.Micro<void, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<void, never, never>
program)10/*11Output12{13 _id: 'Either',14 _tag: 'Left',15 left: MicroCause.Interrupt: interrupted16}17*/
The Micro.race
function lets you race multiple effects concurrently and returns the result of the first one that successfully completes.
1import * as import Micro
Micro from "effect/Micro"2
3const const task1: Micro.Micro<never, string, never>
task1 = import Micro
Micro.const delay: <never, string, never>(self: Micro.Micro<never, string, never>, millis: number) => Micro.Micro<never, string, never> (+1 overload)
Returns an effect that will delay the execution of this effect by the
specified duration.
delay(import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("task1"), 1_000)4const const task2: Micro.Micro<string, never, never>
task2 = import Micro
Micro.const delay: <string, never, never>(self: Micro.Micro<string, never, never>, millis: number) => Micro.Micro<string, never, never> (+1 overload)
Returns an effect that will delay the execution of this effect by the
specified duration.
delay(import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed("task2"), 2_000)5
6const const program: Micro.Micro<string, string, never>
program = import Micro
Micro.const race: <never, string, never, string, never, never>(self: Micro.Micro<never, string, never>, that: Micro.Micro<string, never, never>) => Micro.Micro<string, string, never> (+1 overload)
Returns an effect that races two effects, yielding the value of the first
effect to succeed. Losers of the race will be interrupted immediately
race(const task1: Micro.Micro<never, string, never>
task1, const task2: Micro.Micro<string, never, never>
task2)7
8import Micro
Micro.const runPromise: <string, string>(effect: Micro.Micro<string, string, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<string, string, never>
program).(method) Promise<string>.then<void, never>(onfulfilled?: ((value: string) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)9/*10Output:11task212*/
If you need to handle the first effect to complete, whether it succeeds or fails, you can use the Micro.either
function.
1import * as import Micro
Micro from "effect/Micro"2
3const const task1: Micro.Micro<never, string, never>
task1 = import Micro
Micro.const delay: <never, string, never>(self: Micro.Micro<never, string, never>, millis: number) => Micro.Micro<never, string, never> (+1 overload)
Returns an effect that will delay the execution of this effect by the
specified duration.
delay(import Micro
Micro.const fail: <string>(e: string) => Micro.Micro<never, string, never>
Creates a `Micro` effect that will fail with the specified error.
This will result in a `CauseFail`, where the error is tracked at the
type level.
fail("task1"), 1_000)4const const task2: Micro.Micro<string, never, never>
task2 = import Micro
Micro.const delay: <string, never, never>(self: Micro.Micro<string, never, never>, millis: number) => Micro.Micro<string, never, never> (+1 overload)
Returns an effect that will delay the execution of this effect by the
specified duration.
delay(import Micro
Micro.const succeed: <string>(a: string) => Micro.Micro<string, never, never>
Creates a `Micro` effect that will succeed with the specified constant value.
succeed("task2"), 2_000)5
6const const program: Micro.Micro<Either<never, string> | Either<string, never>, never, never>
program = import Micro
Micro.const race: <Either<never, string>, never, never, Either<string, never>, never, never>(self: Micro.Micro<Either<never, string>, never, never>, that: Micro.Micro<Either<string, never>, never, never>) => Micro.Micro<...> (+1 overload)
Returns an effect that races two effects, yielding the value of the first
effect to succeed. Losers of the race will be interrupted immediately
race(import Micro
Micro.const either: <never, string, never>(self: Micro.Micro<never, string, never>) => Micro.Micro<Either<never, string>, never, never>
Replace the success value of the given `Micro` effect with an `Either`,
wrapping the success value in `Right` and wrapping any expected errors with
a `Left`.
either(const task1: Micro.Micro<never, string, never>
task1), import Micro
Micro.const either: <string, never, never>(self: Micro.Micro<string, never, never>) => Micro.Micro<Either<string, never>, never, never>
Replace the success value of the given `Micro` effect with an `Either`,
wrapping the success value in `Right` and wrapping any expected errors with
a `Left`.
either(const task2: Micro.Micro<string, never, never>
task2))7
8import Micro
Micro.const runPromise: <Either<never, string> | Either<string, never>, never>(effect: Micro.Micro<Either<never, string> | Either<string, never>, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
successful value of the computation.
runPromise(const program: Micro.Micro<Either<never, string> | Either<string, never>, never, never>
program).(method) Promise<Either<never, string> | Either<string, never>>.then<void, never>(onfulfilled?: ((value: Either<never, string> | Either<string, never>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<...>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)9/*10Output:11{ _id: 'Either', _tag: 'Left', left: 'task1' }12*/
Interruptible Operation: If the operation can be interrupted, it is terminated immediately once the timeout threshold is reached, resulting in a TimeoutException
.
1import * as import Micro
Micro from "effect/Micro"2
3const const myEffect: Micro.Micro<string, never, never>
myEffect = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<void, never, never>>, string>(...args: [self: unknown, body: (this: unknown) => Generator<YieldWrap<Micro.Micro<void, never, never>>, string, never>] | [body: ...]) => Micro.Micro<...>
gen(function* () {4 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Start processing...")5 yield* import Micro
Micro.const sleep: (millis: number) => Micro.Micro<void>
Create a `Micro` effect that will sleep for the specified duration.
sleep(2_000) // Simulates a delay in processing6 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Processing complete.")7 return "Result"8})9
10const const timedEffect: Micro.Micro<string, Micro.TimeoutException, never>
timedEffect = const myEffect: Micro.Micro<string, never, never>
myEffect.(method) Pipeable.pipe<Micro.Micro<string, never, never>, Micro.Micro<string, Micro.TimeoutException, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<string, never, never>) => Micro.Micro<string, Micro.TimeoutException, never>): Micro.Micro<...> (+21 overloads)
pipe(import Micro
Micro.const timeout: (millis: number) => <A, E, R>(self: Micro.Micro<A, E, R>) => Micro.Micro<A, E | Micro.TimeoutException, R> (+1 overload)
Returns an effect that will timeout this effect, that will fail with a
`TimeoutException` if the timeout elapses before the effect has produced a
value.
If the timeout elapses, the running effect will be safely interrupted.
timeout(1_000))11
12import Micro
Micro.const runPromiseExit: <string, Micro.TimeoutException>(effect: Micro.Micro<string, Micro.TimeoutException, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const timedEffect: Micro.Micro<string, Micro.TimeoutException, never>
timedEffect).(method) Promise<MicroExit<string, TimeoutException>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<string, Micro.TimeoutException>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<...>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)13/*14Output:15{16 _id: 'Either',17 _tag: 'Left',18 left: (MicroCause.Fail) TimeoutException19 ...stack trace...20}21*/
Uninterruptible Operation: If the operation is uninterruptible, it continues until completion before the TimeoutException
is assessed.
1import * as import Micro
Micro from "effect/Micro"2
3const const myEffect: Micro.Micro<string, never, never>
myEffect = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<void, never, never>>, string>(...args: [self: unknown, body: (this: unknown) => Generator<YieldWrap<Micro.Micro<void, never, never>>, string, never>] | [body: ...]) => Micro.Micro<...>
gen(function* () {4 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Start processing...")5 yield* import Micro
Micro.const sleep: (millis: number) => Micro.Micro<void>
Create a `Micro` effect that will sleep for the specified duration.
sleep(2_000) // Simulates a delay in processing6 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("Processing complete.")7 return "Result"8})9
10const const timedEffect: Micro.Micro<string, Micro.TimeoutException, never>
timedEffect = const myEffect: Micro.Micro<string, never, never>
myEffect.(method) Pipeable.pipe<Micro.Micro<string, never, never>, Micro.Micro<string, never, never>, Micro.Micro<string, Micro.TimeoutException, never>>(this: Micro.Micro<...>, ab: (_: Micro.Micro<string, never, never>) => Micro.Micro<...>, bc: (_: Micro.Micro<...>) => Micro.Micro<...>): Micro.Micro<...> (+21 overloads)
pipe(11 import Micro
Micro.const uninterruptible: <A, E, R>(self: Micro.Micro<A, E, R>) => Micro.Micro<A, E, R>
Wrap the given `Micro` effect in an uninterruptible region, preventing the
effect from being aborted.
uninterruptible,12 import Micro
Micro.const timeout: (millis: number) => <A, E, R>(self: Micro.Micro<A, E, R>) => Micro.Micro<A, E | Micro.TimeoutException, R> (+1 overload)
Returns an effect that will timeout this effect, that will fail with a
`TimeoutException` if the timeout elapses before the effect has produced a
value.
If the timeout elapses, the running effect will be safely interrupted.
timeout(1_000)13)14
15// Outputs a TimeoutException after the task completes, because the task is uninterruptible16import Micro
Micro.const runPromiseExit: <string, Micro.TimeoutException>(effect: Micro.Micro<string, Micro.TimeoutException, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const timedEffect: Micro.Micro<string, Micro.TimeoutException, never>
timedEffect).(method) Promise<MicroExit<string, TimeoutException>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<string, Micro.TimeoutException>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<...>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)17/*18Output:19Start processing...20Processing complete.21{22 _id: 'Either',23 _tag: 'Left',24 left: (MicroCause.Fail) TimeoutException25 ...stack trace...26}27*/
1import * as import Micro
Micro from "effect/Micro"2
3const const program: Micro.Micro<void, never, never>
program = import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<void, never, never>>, void>(...args: [self: unknown, body: (this: unknown) => Generator<YieldWrap<Micro.Micro<void, never, never>>, void, never>] | [body: ...]) => Micro.Micro<...>
gen(function* () {4 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("waiting 1 second")5 yield* import Micro
Micro.const sleep: (millis: number) => Micro.Micro<void>
Create a `Micro` effect that will sleep for the specified duration.
sleep(1_000)6 yield* import Micro
Micro.const interrupt: Micro.Micro<never, never, never>
Abort the current `Micro` effect.
interrupt7 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("waiting 1 second")8 yield* import Micro
Micro.const sleep: (millis: number) => Micro.Micro<void>
Create a `Micro` effect that will sleep for the specified duration.
sleep(1_000)9 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log("done")10})11
12import Micro
Micro.const runPromiseExit: <void, never>(effect: Micro.Micro<void, never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const program: Micro.Micro<void, never, never>
program).(method) Promise<MicroExit<void, never>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<void, never>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log)13/*14Output:15waiting 1 second16{17 _id: 'Either',18 _tag: 'Left',19 left: MicroCause.Interrupt: interrupted20}21*/
1import * as import Micro
Micro from "effect/Micro"2
3const const program: Micro.Micro<void[], never, never>
program = import Micro
Micro.const forEach: <number, void, never, never>(iterable: Iterable<number>, f: (a: number, index: number) => Micro.Micro<void, never, never>, options?: {
readonly concurrency?: Concurrency | undefined;
readonly discard?: false | undefined;
}) => Micro.Micro<...> (+1 overload)
For each element of the provided iterable, run the effect and collect the results.
If the `discard` option is set to `true`, the results will be discarded and
the effect will return `void`.
The `concurrency` option can be set to control how many effects are run in
parallel. By default, the effects are run sequentially.
forEach(4 [1, 2, 3],5 ((parameter) n: number
n) =>6 import Micro
Micro.const gen: <unknown, YieldWrap<Micro.Micro<void, never, never>>, void>(...args: [self: unknown, body: (this: unknown) => Generator<YieldWrap<Micro.Micro<void, never, never>>, void, never>] | [body: ...]) => Micro.Micro<...>
gen(function* () {7 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(`start #${(parameter) n: number
n}`)8 yield* import Micro
Micro.const sleep: (millis: number) => Micro.Micro<void>
Create a `Micro` effect that will sleep for the specified duration.
sleep((parameter) n: number
n * 1_000)9 if ((parameter) n: number
n > 1) {10 yield* import Micro
Micro.const interrupt: Micro.Micro<never, never, never>
Abort the current `Micro` effect.
interrupt11 }12 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(`done #${(parameter) n: number
n}`)13 }),14 { (property) concurrency?: Concurrency | undefined
concurrency: "unbounded" }15)16
17import Micro
Micro.const runPromiseExit: <void[], never>(effect: Micro.Micro<void[], never, never>, options?: {
readonly signal?: AbortSignal | undefined;
readonly scheduler?: Micro.MicroScheduler | undefined;
} | undefined) => Promise<...>
Execute the `Micro` effect and return a `Promise` that resolves with the
`MicroExit` of the computation.
runPromiseExit(const program: Micro.Micro<void[], never, never>
program).(method) Promise<MicroExit<void[], never>>.then<void, never>(onfulfilled?: ((value: Micro.MicroExit<void[], never>) => void | PromiseLike<void>) | null | undefined, onrejected?: ((reason: any) => PromiseLike<never>) | null | undefined): Promise<...>
Attaches callbacks for the resolution and/or rejection of the Promise.
then(((parameter) exit: Micro.MicroExit<void[], never>
exit) =>18 namespace console
var console: Console
The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
* A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and
[`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module.
_**Warning**_: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for
more information.
Example using the global `console`:
```js
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(new Error('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
```
Example using the `Console` class:
```js
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(new Error('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to err
```
console.(method) Console.log(message?: any, ...optionalParams: any[]): void
Prints to `stdout` with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html)
(the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)).
```js
const count = 5;
console.log('count: %d', count);
// Prints: count: 5, to stdout
console.log('count:', count);
// Prints: count: 5, to stdout
```
See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
log(var JSON: JSON
An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.
JSON.(method) JSON.stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string (+1 overload)
Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
stringify((parameter) exit: Micro.MicroExit<void[], never>
exit, null, 2))19)20/*21Output:22start #123start #224start #325done #126{27 "_id": "Either",28 "_tag": "Left",29 "left": {30 "_tag": "Interrupt",31 "traces": [],32 "name": "MicroCause.Interrupt"33 }34}35*/