MCPcopy Index your code
hub / github.com/akheron/optics-ts

github.com/akheron/optics-ts @v2.4.1

Chat with this repo
repository ↗ · DeepWiki ↗ · release v2.4.1 ↗ · + Follow
431 symbols 663 edges 111 files 0 documented · 0% 4 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

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.

Extension points exported contracts — how you extend this code

Equivalence (Interface)
(no doc) [1 implementers]
src/index.ts
HKT (Interface)
(no doc)
src/hkt.ts
NotAnArrayType (Interface)
(no doc)
src/utils.ts
OpticFn (Interface)
(no doc)
src/internals.ts
WhenA (Interface)
(no doc)
src/standalone/when.ts
Composition (Interface)
(no doc)
scripts/generate-index.ts
InnerBarF (Interface)
(no doc)
tests/guard.spec.ts
Iso (Interface)
(no doc) [1 implementers]
src/index.ts

Core symbols most depended-on inside this repo

prop
called by 48
src/index.ts
compose
called by 33
src/internals.ts
compose
called by 31
src/index.ts
elems
called by 20
src/index.ts
lens
called by 14
src/internals.ts
filter
called by 13
src/index.ts
optional
called by 12
src/index.ts
partsOf
called by 10
src/index.ts

Shape

Method 240
Interface 99
Function 90
Class 2

Languages

TypeScript100%

Modules by API surface

src/index.ts229 symbols
src/internals.ts65 symbols
scripts/generate-index.ts20 symbols
src/hkt.ts19 symbols
src/standalone/errors.ts13 symbols
src/interop.ts7 symbols
src/standalone/operations.ts6 symbols
src/standalone/compose.ts5 symbols
src/standalone/guard.ts4 symbols
src/standalone/filter.ts4 symbols
src/standalone/pick.ts3 symbols
src/standalone/partsOf.ts3 symbols

For agents

$ claude mcp add optics-ts \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact