Pular para o conteúdo
Skillpedia
APIs e servidores (backend)48 mil · #3024

fp-async

Faz seu agente usar padrões para lidar com operações assíncronas. Ajuda a escrever código mais limpo e organizado, evitando erros.

O que ela faz

Esta ferramenta ajuda a organizar e gerenciar operações assíncronas (que levam tempo para serem concluídas) em seu código, especialmente quando elas podem falhar. Ela usa um método chamado `TaskEither` para garantir que os erros sejam tratados de forma clara e organizada, evitando confusão.

Quando usar

  • ✓Quando você precisa lidar com operações que demoram, como buscar dados de uma API ou salvar informações em um banco de dados.
  • ✓Se você está tendo dificuldades em organizar o tratamento de erros em seu código assíncrono, com muitos blocos `try/catch` aninhados.
  • ✓Para criar sequências de operações assíncronas que precisam ser executadas em ordem e ter seus erros gerenciados de forma consistente.

Exemplo do que pedir para a IA

“Como posso usar `TaskEither` para buscar dados de uma API e garantir que os erros de rede sejam tratados?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/fp-async/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/fp-async/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

A ferramenta usa `TaskEither`, que é como uma caixa que pode conter um resultado bem-sucedido ou um erro. Ela permite encadear operações assíncronas, garantindo que, se uma falhar, o erro seja capturado e tratado de forma limpa, sem interromper o fluxo do programa.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add sickn33/agentic-awesome-skills --skill fp-async

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/fp-async/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões Assíncronos Práticos com fp-ts

Pare de escrever blocos try/catch aninhados. Pare de perder o contexto de erros. Comece a construir pipelines assíncronos limpos que tratam erros adequadamente.

TaskEither é simplesmente uma operação assíncrona que rastreia sucesso ou falha. É só isso. Não é necessária terminologia complicada.

Guia Detalhado

Leia o guia detalhado antes de executar esta habilidade. Ele retém o procedimento completo e o material de referência. Trate seus requisitos de segurança, pré-requisitos e validação como obrigatórios. Para um trabalho focado, carregue as seções relevantes; para um trabalho de ponta a ponta, leia o guia completamente.

Quando Usar

  • Você precisa de tratamento de erros assíncronos em TypeScript com TaskEither.
  • A tarefa envolve encapsular Promises, compor chamadas de API ou substituir fluxos try/catch aninhados.
  • Você quer padrões assíncronos práticos de fp-ts em vez de explicações acadêmicas.
// TaskEither<Error, User> means:
// "An async operation that either fails with Error or succeeds with User"

5. Exemplos Reais de API

Wrapper Completo de Fetch

// types.ts
interface ApiError {
  code: string
  message: string
  status: number
  details?: unknown
}

// api.ts
const createApiError = (
  code: string,
  message: string,
  status: number,
  details?: unknown
): ApiError => ({ code, message, status, details })

const request = <T>(
  url: string,
  options: RequestInit = {}
): TE.TaskEither<ApiError, T> =>
  TE.tryCatch(
    async () => {
      const response = await fetch(url, {
        headers: {
          'Content-Type': 'application/json',
          ...options.headers,
        },
        ...options,
      })

      if (!response.ok) {
        const body = await response.json().catch(() => ({}))
        throw createApiError(
          body.code || 'HTTP_ERROR',
          body.message || response.statusText,
          response.status,
          body
        )
      }

      // Handle 204 No Content
      if (response.status === 204) {
        return undefined as T
      }

      return response.json()
    },
    (error): ApiError => {
      if (typeof error === 'object' && error !== null && 'code' in error) {
        return error as ApiError
      }
      return createApiError(
        'NETWORK_ERROR',
        error instanceof Error ? error.message : 'Request failed',
        0
      )
    }
  )

// API client
const api = {
  get: <T>(url: string) => request<T>(url),

  post: <T>(url: string, body: unknown) =>
    request<T>(url, {
      method: 'POST',
      body: JSON.stringify(body)
    }),

  put: <T>(url: string, body: unknown) =>
    request<T>(url, {
      method: 'PUT',
      body: JSON.stringify(body)
    }),

  delete: (url: string) =>
    request<void>(url, { method: 'DELETE' }),
}

// Usage
const getUser = (id: string) => api.get<User>(`/api/users/${id}`)
const createUser = (data: CreateUserDto) => api.post<User>('/api/users', data)
const updateUser = (id: string, data: UpdateUserDto) => api.put<User>(`/api/users/${id}`, data)
const deleteUser = (id: string) => api.delete(`/api/users/${id}`)

Operações de Banco de Dados (Exemplo Prisma)

import { PrismaClient, Prisma } from '@prisma/client'

type DbError =
  | { _tag: 'NotFound'; entity: string; id: string }
  | { _tag: 'UniqueViolation'; field: string }
  | { _tag: 'ConnectionError'; cause: unknown }

const prisma = new PrismaClient()

const wrapPrisma = <T>(
  operation: () => Promise<T>
): TE.TaskEither<DbError, T> =>
  TE.tryCatch(
    operation,
    (error): DbError => {
      if (error instanceof Prisma.PrismaClientKnownRequestError) {
        if (error.code === 'P2002') {
          const field = (error.meta?.target as string[])?.join(', ') || 'unknown'
          return { _tag: 'UniqueViolation', field }
        }
        if (error.code === 'P2025') {
          return { _tag: 'NotFound', entity: 'Record', id: 'unknown' }
        }
      }
      return { _tag: 'ConnectionError', cause: error }
    }
  )

// Padrão de repositório
const userRepository = {
  findById: (id: string): TE.TaskEither<DbError, User> =>
    pipe(
      wrapPrisma(() => prisma.user.findUnique({ where: { id } })),
      TE.chain(user =>
        user
          ? TE.right(user)
          : TE.left({ _tag: 'NotFound', entity: 'User', id })
      )
    ),

  findByEmail: (email: string): TE.TaskEither<DbError, User | null> =>
    wrapPrisma(() => prisma.user.findUnique({ where: { email } })),

  create: (data: CreateUserInput): TE.TaskEither<DbError, User> =>

…
Perguntas frequentes

O que é `TaskEither`?

`TaskEither` é uma forma de representar uma operação assíncrona que pode ter sucesso ou falhar. Pense nele como um pacote que contém ou o resultado esperado ou uma descrição do erro que ocorreu.

Por que usar isso em vez de `try/catch`?

Usar `TaskEither` ajuda a evitar muitos blocos `try/catch` aninhados, que podem tornar o código confuso. Ele oferece uma maneira mais estruturada e clara de lidar com erros em operações assíncronas.

Preciso saber programação avançada para usar isso?

Não necessariamente. Embora use alguns conceitos de programação funcional, a ideia principal é simplificar o tratamento de erros em operações que levam tempo para serem concluídas, tornando o código mais legível.

Detalhes

Descrição original do autor

Practical async patterns using TaskEither - clean pipelines instead of try/catch hell, with real API examples

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#3024
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas