• Stars
    star
    680
  • Rank 64,244 (Top 2 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 4 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Type-safe, ergonomic, polymorphic optics for TypeScript

optics-ts

Build

optics-ts provides type-safe, ergonomic, polymorphic optics for TypeScript:

  • Optics allow you to read or modify values from deeply nested data structures, while keeping all data immutable.
  • Ergonomic: Optics are composed with method chaining, making it easy and fun!
  • Polymorphic: When writing through the optics, you can change the data types in the nested structure.
  • Type-safe: The compiler will type check all operations you do. No any, ever.

➡ Documentation ⬅

Features

optics-ts supports lenses, prisms, traversals, removing items from containers, and much more!

Since optics-ts v2.2.0, there are two syntaxes for defining optics: method chaining (the default) and standalone optics (experimental). See the docs for more info!

Getting started

Installation:

npm install optics-ts

or

yarn add optics-ts

Here's a simple example demonstrating how lenses can be used to drill into a nested data structure:

import * as O from 'optics-ts'

type Book = {
  title: string
  isbn: string
  author: {
    name: string
  }
}

// Create a lens that focuses on author.name
const optic = O.optic_<Book>().prop('author').prop('name')

// This is the input data
const input: Book = {
  title: "The Hitchhiker's Guide to the Galaxy",
  isbn: '978-0345391803',
  author: {
    name: 'Douglas Adams',
  },
}

// Read through the optic
O.get(optic)(input)
// "Douglas Adams"

// Write through the optic
O.set(optic)('Arthur Dent')(input)
// {
//   title: "The Hitchhiker’s Guide to the Galaxy"
//   isbn: "978-0345391803",
//   author: {
//     name: "Arthur Dent"
//   }
// }

// Update the existing value through the optic, while also changing the data type
O.modify(optic)((str) => str.length + 29)(input)
// {
//   title: "The Hitchhiker’s Guide to the Galaxy"
//   isbn: "978-0345391803",
//   author: {
//     name: 42
//   }
// }

Another example that converts all words longer than 5 characters to upper case:

import * as O from 'optics-ts/standalone'

const optic = O.optic<string>().words().when(s => s.length >= 5)

const input = 'This is a string with some shorter and some longer words'
O.modify(optic)((s) => s.toUpperCase()(input)
// "This is a STRING with some SHORTER and some LONGER WORDS"

See the documentation for a tutorial and a detailed reference of all supported optics.

Development

Run yarn to install dependencies.

Running the test suite

Run yarn test.

For compiling and running the tests when files change, run these commands in separate terminals:

yarn build:test --watch
yarn jest dist-test/ --watchAll

Documentation

You need Python 3 to build the docs.

python3 -m venv venv
./venv/bin/pip install mkdocs-material

Run a live reloading server for the documentation:

./venv/bin/mkdocs serve

Open http://localhost:8000/ in the browser.

Releasing

$ yarn version --new-version <major|minor|patch>
$ yarn publish
$ git push origin main --tags

Open https://github.com/akheron/optics-ts/releases, edit the draft release, select the newest version tag, adjust the description as needed.

More Repositories

1

jansson

C library for encoding, decoding and manipulating JSON data
C
2,986
star
2

typera

Type-safe routes for Express and Koa
TypeScript
173
star
3

sqltyper

TypeScript types for raw PostgreSQL queries
TypeScript
120
star
4

cpython

**No longer updated!** CPython has moved to GitHub: https://github.com/python/cpython
Python
61
star
5

sala

Simple encrypted password storage
Rust
28
star
6

typera-openapi

Generate OpenAPI spec from typera routes
TypeScript
23
star
7

stango

Static web site generator for Python programmers
Python
22
star
8

diceware.py

Diceware passphrase generator
Python
20
star
9

multipy

Install multiple Python versions locally
Shell
19
star
10

dependabot-cron-action

Merge Dependabot pull requests in a cron schedule
TypeScript
10
star
11

cram

Git mirror of https://bitbucket.org/brodie/cram/
Python
8
star
12

skijump3-remake

Skijump International v3 (remake)
Rust
5
star
13

hashtable

A hashtable implementation
C
5
star
14

emacs-config

My emacs configuration
Emacs Lisp
4
star
15

purescript-httpure-extras

Common utilities for HTTPure
PureScript
3
star
16

xkb

My XKB config
3
star
17

elm-easter

Compute the date of Easter for any given year
Elm
2
star
18

passman

2
star
19

brainfuck

Brainfuck interpreter written in Elm
Elm
2
star
20

www.digip.org

The Stango project for my personal website
HTML
2
star
21

git-hg

Push and pull from a Hg server using git
Shell
2
star
22

wings-reverse

Reversing Wings 1.40
Rust
2
star
23

sinap

Sinap IRC bot
Python
1
star
24

microposture

A program for 2 micro:bit devices for monitoring your back posture
Python
1
star
25

jansson-debian

Debianization for Jansson
C
1
star
26

jansson-debian-pre2.0

Debianization for Jansson
Shell
1
star
27

sahko

Control electrical devices by turning GPIO pins on and off on a Raspberry Pi based on the electricity spot price
Rust
1
star