Skip to content

Minimal Effect system for TypeScript. Lazy, composable, cancellable.

Notifications You must be signed in to change notification settings

jacob-ebey/mini-effect

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mini-effect

Minimal Effect system for TypeScript. Lazy, composable, cancellable.

Installation

npm install mini-effect

Example

Load and display TODOs from https://jsonplaceholder.typicode.com.

import * as Effect from "mini-effect";
import * as Concurrency from "mini-effect/concurrency";
import * as Fetch from "mini-effect/fetch";
import * as Schema from "mini-effect/schema";

const log = (...values: unknown[]) => {
  console.log(...values);
  return Effect.succeed();
};

const TodoSchema = Schema.object({
  id: Schema.number(),
  title: Schema.string(),
  completed: Schema.boolean(),
});

const loadTodo = (id: number) =>
  Effect.retry(
    1,
    Fetch.request(`https://jsonplaceholder.typicode.com/todos/${id}`).pipe(
      Fetch.json,
      Schema.validate(TodoSchema),
    ),
  );

const loadManyTodos = (ids: number[]) => Concurrency.all(ids.map(loadTodo));

const logTodo = (todo: Schema.InferOutput<typeof TodoSchema>) =>
  log(`
  TODO ${todo.id}
    title: ${todo.title}
    completed: ${todo.completed}
`);

const logManyTodos = (todos: Schema.InferOutput<typeof TodoSchema>[]) =>
  Effect.gen(function* () {
    for (const todo of todos) yield* logTodo(todo);
  });

const getIdsToLoad = Effect.fn(() => process.argv.slice(2)).pipe(
  Schema.validate(
    Schema.array(Schema.pipe(Schema.string(), Schema.toNumber())),
  ),
);

const loadAndDisplayTodos = Effect.pipe(
  getIdsToLoad,
  loadManyTodos,
  logManyTodos,
);

const program = loadAndDisplayTodos.pipe(
  Effect.catchTags({
    FailedToFetch: () => log("Failed to fetch todos."),
    FailedToRead: () => log("Failed to parse todos JSON."),
    FailedToValidate: () => log("Failed to validate data."),
  }),
);

await Effect.run(program);

License

MIT

About

Minimal Effect system for TypeScript. Lazy, composable, cancellable.

Resources

Stars

Watchers

Forks