Nest.JS | Mônadas -> Leitor

Jan 27 2023
A mônada Reader, também conhecida como “mônada de ambiente”, é um conceito de programação funcional que permite passar um ambiente, ou um contexto compartilhado, ao longo de uma computação. Ele permite que você escreva código independente dos valores específicos desse contexto, tornando-o mais reutilizável e fácil de testar.

A mônada Reader, também conhecida como “mônada de ambiente”, é um conceito de programação funcional que permite passar um ambiente, ou um contexto compartilhado, ao longo de uma computação. Ele permite que você escreva código independente dos valores específicos desse contexto, tornando-o mais reutilizável e fácil de testar.

A mônada Reader é frequentemente usada para gerenciar dependências e valores de configuração em uma linguagem de programação funcional, como JavaScript. A mônada do Reader permite que você descreva uma computação que depende de algum contexto externo de uma maneira pura e combinável, o que torna mais fácil raciocinar e testar seu código.

Uma mônada Reader é normalmente implementada como um objeto que possui um único método, chamado run, que recebe o contexto como entrada e retorna o resultado da computação. A mônada Reader pode ser usada para encadear várias computações que dependem do mesmo contexto e criar computações mais complexas.

Aqui está um exemplo da mônada Reader em JavaScript:

class Reader {
  constructor(fn) {
    this.run = fn
  }
  map(f) {
    return new Reader(e => f(this.run(e)))
  }
  chain(f) {
    return new Reader(e => f(this.run(e)).run(e))
  }
  // ...
}

Por exemplo, você pode criar um Reader que pega um objeto de configuração e retorna um valor com base nessa configuração. Você pode então encadear vários desses Leitores para criar uma computação mais complexa, sem ter que passar o objeto de configuração por cada etapa.

É importante notar que o Reader Monad não é um padrão comum em JavaScript, é usado principalmente em linguagens de programação funcionais como Haskell, scala, etc.

Aqui está um exemplo de como você pode usar o ReaderMonad no Nest.js:

import { Injectable } from '@nestjs/common';
import { Reader, reader } from 'fp-ts/lib/Reader';

@Injectable()
export class MyService {
  public incrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter + 1);
  }

  public decrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter - 1);
  }

  public getCounter(counter: number): Reader<number, number> {
    return reader.of(counter);
  }
}

A ReaderMônada é usada para abstrair a passagem de configuração, dependências ou contexto ao longo de um programa ou conjunto de funções.

Neste exemplo, o incrementCounter()método incrementa o contador e retorna um novo valor, o decrementCounter()método decrementa o contador e retorna um novo valor, o getCounter()método retorna o valor atual do contador.

Você pode encadear vários cálculos usando os métodos .map(), .chain(), .ap().

const program: Reader<number, number> = myService
  .incrementCounter(10)
  .chain(counter => myService.decrementCounter(counter))
  .chain(counter => myService.getCounter(counter));

console.log(program.run());

É importante observar que este exemplo é básico e não demonstra todo o poder das Mônadas na programação funcional. As mônadas podem ser usadas para lidar com vários casos, como tratamento de erros, encadeamento de vários cálculos e muito mais. É melhor entender o problema e os casos de uso antes de aplicar as mônadas.

Além disso, o run()método deve ser chamado para executar o Reader Monad e obter os resultados, ele toma o ambiente como argumento.

Lista de peças: