Mas se é impossível se comunicar com o ambiente, como fazer qualquer coisa útil?
Usando funções impuras :(
Mas minimizando a quantidade e o escopo delas.
Núcleo funcional, casca imperativa.
Array.map, Array.filter,
Array.reduce, etc.{ it -> ... }.Soma de números em um array.
Contar quantidade de linhas em um texto.
export class DateConverter implements Converter<Date | string | number, string> {
convert(input: Date | string | number): string {
if (!input) return '';
let dateTime: DateTime;
if (typeof input === 'string') {
dateTime = DateTime.fromISO(input);
} else if (typeof input === 'number') {
dateTime = DateTime.fromSeconds(input as number);
} else if (input instanceof Date) {
dateTime = DateTime.fromJSDate(input);
} else {
throw new Error('Invalid input type. Expecting a string or a Date object.');
}
return dateTime.toFormat('dd/MM/yyyy');
}
}const parseDateTime = (input: Date | string | number): DateTime => {
if (typeof input === 'string') {
return DateTime.fromISO(input);
} else if (typeof input === 'number') {
return DateTime.fromSeconds(input as number);
} else if (input instanceof Date) {
return DateTime.fromJSDate(input);
} else {
throw new Error('Invalid input type. Expecting a string or a Date object.');
}
}
const dateConverter: ConverterFn<Date | string | number, string> = (input) => {
if (!input) return '';
return parseDateTime(input).toFormat('dd/MM/yyyy');
}const createDateConverter = (format: string): ConverterFn<Date | string | number, string> =>
(input) => {
if (!input) return '';
return parseDateTime(input).toFormat(format);
}
const dateConverter = createDateConverter('dd/MM/yyyy');
const dateHourConverter = createDateConverter('dd/MM/yyyy HH:mm');
const bestDateConverter = createDateConverter('yyyy/MM/dd');Removemos código duplicado!
Essa estratégia de criar funções “geradoras” que retornam funções mais específicas é chamado de aplicação parcial ou Currying.
const applyOr = <I, O>(fn1: ConverterFn<I, O>, fn2: ConverterFn<I, O>): ConverterFn<I, O> =>
(input) => {
const result = fn1(input);
return Boolean(result) ? result : fn2(input);
}
const dateConverter = createDateConverter('dd/MM/yyyy');
const dateConv1 = applyOr(dateConverter, (_) => '--');
const dateConv2 = applyOr(dateConverter, (_) => 'SEM DATA');Um problema com essa implementação é que é difícil saber quando uma operação falhou. Isso é importante para aplicar as operações subsequentes.
Algumas linguagens funcionais resolvem esse problema com Functors, Applicatives e Monads. São conceitos relacinados à Teoria das Categorias, que é uma área da Matemática.
java.util.Optional tem uma interface funcional nos
métodos map, flatMap, filter,
etc.
Os tipos nulláveis do Kotlin (T?) também possuem
interface semelhante.