npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ultra-result

v2.0.7

Published

Librería para el manejo de resultados. Esta librería busca hacer más expresivo el manejo de los resultados de llamadas a distintas funciones.

Downloads

1,383

Readme

Ultra-Result

Librería para el manejo de resultados.

Esta librería busca hacer más expresivo el manejo de los resultados de llamadas a distintas funciones.

Problema que resuelve

El objetivo es hacer más expresivo el código que generamos. La idea es que se evite romper el flujo de control con IFs, Loops y switch.

Inspiración

Se toman un montón de ideas de la programación funcional.

Se toman bastante ideas de la librería fp-ts que maneja un montón de conceptos funcionales en typescript.

Conceptos principales

Execution

Clase para representar un cambio síncrono en el estado de la aplicación.

Se entiende por ejecución cualquier función que hace un cambio en la aplicación. Esto incluye creación de objetos, transformación de objetos, etc.

Para ejecuciones asíncronas ver TaskExecution.

Validation

Clase para representar una validación síncrona a realizar sobre un dato. Una validación no realiza transformación en ninguna variable o estado de la aplicación.

Se utiliza normalmente para garantizar que un dato cumple con unas reglas. Por ejemplo, IsEmail, MaxLength, HasAccess, etc.

Para validaciones asíncronas ver TaskValidation.

Task

Define una interface básica para una tarea asíncrona. En la mayoría de los casos, vas a usar TaskValidation o TaskExecution, pero se incluye el Task porque es el tipo base para ambos.

Cuándo utilices cualquier tipo de tarea, se va a devolver una función que crea la promesa. Por esta razón para obtener el resultado final, debes usar:

const process = task(...);
const result = await process();

TaskExecution

Clase para representar una Ejecución que se realiza asíncronamente.

Para ejecuciones síncronas ver Execution.

TaskValidation

Clase para representar una Validación que se realiza asíncronamente.

Para validaciones asíncronas ver Validation.

Seed - Encadenamiento de funciones

Se provee la clase "seed" como mecanismo para encadenar operaciones.

La idea es utilizar la misma idea de los observables, dónde se aplican distintas funciones sin tener que trabajar directamente con los valores.

La clase seed es muy sencilla y sólo provee el método "pipe". Este métod simplemente se encarga de llamar consecutivamente las funciones suministradas, pasando la salida de la anterior como entrada de la próxima.

Cada función en el pipe debe ser una función con un sólo parámetro.

const process = seed(1)
    .pipe(
        (value) => value+1
        (value) => value*10
    );
expect(process).toBe(20);

Operadores comunes

Cada tipo de datos ofrece operadores comunes. Estos operadores manejan el mismo concepto aplicado a cada tipo de datos.

chain

Aplica una función para crear un nuevo objeto. La función recibe el valor almacenado en el objeto actual y devuelve un nuevo objeto.

fold

Permite aplicar una función al valor exitoso o una función al error. El operador ejecuta la función de acuerdo al status del objeto.

fromError

Crea un nuevo objeto a partir de una lista de errores. El objeto creado es del tipo Invalid o Fail.

fromValue

Crea un nuevo objeto a partir de un valor. El objeto creado es del tipo Ok o Valid.

map

Aplica una función para transformar el valor de un objeto. La función recibe el valor almacenado en el objeto actual y devuelve un nuevo valor.

tapValue

Aplica un efecto colateral en el valor del objeto. La función sólo se ejecuta si el objeto está en Ok o Valid.

tap

Aplica un efecto colateral en el objeto. La función recibe el objeto completo.

Tests

La librería tiene tests para todas las clases principales y cada operador implementado.

Cada test está pegado al archivo correspondiente con la extensión "spec".

Te recomiendo que revises los tests que sirven como documentación de cómo funciona cada clase y operador.