Skip to content

fp4ts/fp4ts

Repository files navigation

fp4ts

Node.js CI

Publish Nightly

codecov

Welcome to fp4ts! Fp4ts is a zero-dependency, purely functional library that attempts to provide idiomatic support for lazy, safe, and performant functional programming in Typescript by porting a portion of the Typelevel and Haskell ecosystems.

The project is currently under development and is not intended to be used in production.

Project Structure

Fp4ts is fairly large and offers multiple packages:

  • @fp4ts/core The library implementing basic building blocks and utilities used across the rest of the packages, namely the HKT abstraction.

  • @fp4ts/cats Port of the Cats library providing basic data types, collections and fundamental abstraction (e.g., Functor, Monad) used for functional programming. It also provides a set of laws, to verify correctness of those implementations.

    • @fp4ts/cats-kernel Small set of basic types and type classes (included)
    • @fp4ts/cats-core Majority of the type classes and basic data types (included)
    • @fp4ts/cats-laws Laws for testing type class instances/implementations
    • @fp4ts/cats-profunctor Profunctor type classes, data type, and instances for core types
    • @fp4ts/cats-profunctor-laws Laws for testing profunctor type classes
    • @fp4ts/cats-arrow Arrow type classes, data type, and instances for core types
    • @fp4ts/cats-arrow-laws Laws for testing arrow type classes
    • @fp4ts/cats-test-kit Jest integration for testing type class instances and collection of builtin arbitraries for provided data types
    • @fp4ts/free Free structures
  • @fp4ts/collections Basic collections such as List, LazyList, OrdMap, and OrdSet.

    • @fp4ts/collections-core Implementation of the collection data types (included)
    • @fp4ts/collections-test-kit Set of fast-check arbitraries for the collections.
  • @fp4ts/mtl Monad Transformer Library

    • @fp4ts/mtl-core Set of type classes and transformer data types (included)
    • @fp4ts/mtl-laws Set of laws for testing monad transformer implementations
  • @fp4ts/effect Port of the Cats Effect library providing data types, fundamental abstraction (e.g., MonadCancel, Async) used for effectful and async functional programming. It also provides a set of laws, to verify correctness of those implementations.

    • @fp4ts/effect-kernel Set of type classes for describing effectful computations/data types (included)
    • @fp4ts/effect-core Implementations of the IO and SyncIO data types (included)
    • @fp4ts/effect-std Implementations of the standard effectful data types such as Queue or Semaphore (included)
    • @fp4ts/effect-laws Laws for testing type class instances/implementations
    • @fp4ts/effect-test-kit Jest integration for testing type class instances and collection of builtin arbitraries for provided data types
  • @fp4ts/fused Partial port of the fused-effects providing algebraic, higher-order, extensible effects with a standard library compatible with @fp4ts/cats-mtl.

    • @fp4ts/fused-kernel Set of type classes and primitives for defining effect carriers as well as interpreters (included)
    • @fp4ts/fused-core Definition of standard effect types (included)
    • @fp4ts/fused-std Library of standard effect carriers using @fp4ts/cats-mtl (included)
  • @fp4ts/http Port of the http4s library, providing minimal functional interface for building HTTP services. In addition to the http4s, this port also includes Servant-like dsl for API declaration.

    • @fp4ts/http-core Implementation of the basic data types for building HTTP services, such as Request<F>, Response<F>, and more (included)
    • @fp4ts/http-client Definition of the Client<F> type and its default implementation
    • @fp4ts/http-server Definition of the Server<F> type and a set of middlewares
    • @fp4ts/dsl Servant-like library for defining APIs
    • @fp4ts/dsl-client Derivation of the clients for APIs defined using @fp4ts/dsl
    • @fp4ts/dsl-server Derivation of the servers for APIs defined using @fp4ts/dsl
    • @fp4ts/node-client Node.js bindings for the HTTP clients
    • @fp4ts/node-server Node.js bindings for the HTTP servers
    • @fp4ts/test-kit Library for testing HTTP services and clients
    • @fp4ts/test-kit-node Node bindings for testing HTTP services and clients
  • @fp4ts/logging Logging library inspired by log4cats, purescript-logging, and zio-logging. The library provides brackets using Writer, WriterT and Console type classes.

    • @fp4ts/logging-kernel Set of type classes and default implementation for logging (included)
    • @fp4ts/logging-core Implementation for standard loggers (included)
  • @fp4ts/optics Port of the lens library, a Haskell optics library providing families of lenses, isomorphisms, folds, traversals, setters, and getters.

    • @fp4ts/optics-core Implementation of the common regular, index preserving and indexed optics (included)
    • @fp4ts/optics-derivation Binding for deriving common optics from @fp4ts/schema definitions (included)
    • @fp4ts/optics-std Implementation of standard optics (included)
    • @fp4ts/optics-laws Set of laws to verify properties of the optics
  • @fp4ts/parse Adaptation of the Parsec library, a parser combinator library with polymorphic input and evaluation effect type. By default, the library provides tools for text parsing. Parsec was chosen instead of the cats-parse existing in the Typelevel ecosystem for the simplicity of the implementation, support for polymorphic input types and contrary to the decision made in cats-pase, unification of parsers guaranteed to consume input and ones that do not.

    • @fp4ts/prase-kernel Type classes for defining tokens and streams of values (included)
    • @fp4ts/parse-core Implementation of the parse and its default combinators (included)
    • @fp4ts/parse-text Implementation of the text-parses and helpers for their usage (included)
  • @fp4ts/schema The library for describing types of Kind-0 and Kind-1, with derivation capabilities for common typeclasses such as Eq, Functor, Foldable, and more. Inspired by io-ts, shapeless, and kittens.

    • @fp4ts/schema-kernel Type classes for describing types for derivations of Kind-0 and Kind-1 types (included)
    • @fp4ts/schema-core Derivable data types for validation, encoding and decoding of types (included)
    • @fp4ts/schema-derivation Derivation of data type constructors (included)
    • @fp4ts/schema-json JSON-specific encoders and decoders
    • @fp4ts/schema-laws Set of laws for codable data types
    • @fp4ts/schema-test-kit Set of arbitraries for testing schemable types
  • @fp4ts/sql Partial port of the doobie library providing functional interface for SQL databases.

    • @fp4ts/sql-core Core data types for describing communication with RDMS (included)
    • @fp4ts/sql-mariadb Driver for MariaDB
    • @fp4ts/sql-pg Driver for Postgres
    • @fp4ts/sql-sqlite Driver for SQLite
  • @fp4ts/stream Port of the FS2 library for purely functional, effect-ful, and polymorphic stream processing.

    • @fp4ts/stream-core Definition of basic Stream, Pull and Chunk types, and related type classes for compiling the effectful streams (included)
    • @fp4ts/stream-io Node.js interop providing bindings for Readable, Writable and console IO

Each of the listed packages is released separately. However, packages which are marked as included can be consumed by installing the root module. For example, for consuming anything from @fp4ts/cats-kernel or @fp4ts/cats-core one can just install @fp4ts/cats and:

import { Ord, None, Some } from '@fp4ts/cats';
import { OrdMap } from '@fp4ts/collections';

const xs: [string, number][] = [['a', 42], ['b', 43]];
const x: OrdMap<string, string> = OrdMap
  .fromArray(xs, Ord.fromUniversalCompare())
  .collect(v => v % 2 === 0 ? Some(`${v}`) : None)

...

Versioning

As the project is under development and not intended to be used in production, all of the packages are versioned as 0.0.x without any API stability guarantees.

Examples

License

The MIT License (MIT)

Copyright (c) 2021-2023 Peter Matta.

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

The full license with all references to ported projects can be found in LICENSE file.