A generic framework for on-demand, incrementalized computation. Inspired by adapton, glimmer, and rustc's query system.
Find a file
Shunsuke Shibayama 17bc55d699
Some checks failed
Test / Test (push) Has been cancelled
Release-plz / Release-plz release (push) Has been cancelled
Release-plz / Release-plz PR (push) Has been cancelled
Book / Book (push) Has been cancelled
Test / Miri (push) Has been cancelled
Test / Shuttle (push) Has been cancelled
Test / Benchmarks (push) Has been cancelled
Book / Deploy (push) Has been cancelled
pass Cycle to the cycle recovery function (#1028)
* pass `CycleHeads` to the cycle recovery function

* remove the second parameter `Id` of `cycle_fn`

* Update cycle.rs

* Revert "Update cycle.rs"

This reverts commit cc35b82a99.

* partially revert changes in #1021

There was actually no need to run `recover_from_cycle` if the query is converged

* Expose `Cycle` instead of `CycleHeads`

* add `Cycle::map`

* Separate `previous_value` from `Cycle`

This is more ergonomic when sharing `Cycle`

* `Cycle` should be passed by ref

* add `Cycle::id`

* Update execute.rs

* Update memo.rs

* defer `head_ids` creation

* Revert "defer `head_ids` creation"

This reverts commit 23b4ba79e7.

* make all `Cycle` fields private and provide public accessor methods
2025-11-21 07:39:30 +00:00
.devcontainer devcontainer definition 2024-07-28 10:16:36 +00:00
.github refactor: Push active query in execute (#996) 2025-09-30 12:22:03 +00:00
benches pass Cycle to the cycle recovery function (#1028) 2025-11-21 07:39:30 +00:00
book Call cycle_fn for every iteration (#1021) 2025-11-05 12:37:23 +00:00
components pass Cycle to the cycle recovery function (#1028) 2025-11-21 07:39:30 +00:00
examples fix: Delete not re-created tracked structs after fixpoint iteration (#979) 2025-08-19 11:59:11 +00:00
src pass Cycle to the cycle recovery function (#1028) 2025-11-21 07:39:30 +00:00
tests pass Cycle to the cycle recovery function (#1028) 2025-11-21 07:39:30 +00:00
.dir-locals.el ask emacs to rustfmt on save 2018-09-28 11:26:57 -04:00
.gitignore Fix clippy issues 2022-08-24 18:45:53 +02:00
Cargo.toml Run fixpoint per strongly connected component (#999) 2025-10-16 09:23:03 +00:00
CHANGELOG.md chore: release v0.24.0 (#929) 2025-10-05 08:11:53 +02:00
FAQ.md Update New Mexico state question 2020-06-26 15:48:29 +01:00
justfile Replace loom with shuttle (#876) 2025-05-23 15:28:51 +00:00
LICENSE-APACHE add readme, license, etc 2018-09-28 11:01:27 -04:00
LICENSE-MIT add readme, license, etc 2018-09-28 11:01:27 -04:00
README.md docs: update release steps (#705) 2025-03-19 15:19:38 +01:00
release-plz.toml chore: Group versions of packages together for releases (#751) 2025-03-09 19:32:06 +01:00
RELEASES.md highlight breaking changes 2019-08-15 08:08:00 -04:00

salsa

Test Book Released API docs Crates.io

A generic framework for on-demand, incrementalized computation.

Salsa Logo

Obligatory warning

Very much a WORK IN PROGRESS at this point.

Credits

This system is heavily inspired by adapton, glimmer, and rustc's query system. So credit goes to Eduard-Mihai Burtescu, Matthew Hammer, Yehuda Katz, and Michael Woerister.

Key idea

The key idea of salsa is that you define your program as a set of queries. Every query is used like function K -> V that maps from some key of type K to a value of type V. Queries come in two basic varieties:

  • Inputs: the base inputs to your system. You can change these whenever you like.
  • Functions: pure functions (no side effects) that transform your inputs into other values. The results of queries are memoized to avoid recomputing them a lot. When you make changes to the inputs, we'll figure out (fairly intelligently) when we can re-use these memoized values and when we have to recompute them.

Want to learn more?

To learn more about Salsa, try one of the following:

Getting in touch

The bulk of the discussion happens in the issues and pull requests, but we have a zulip chat as well.

Contributing

To create a release and publish to crates.io, update the version field in Cargo.toml. After pushed, GitHub Actions will publish the crates to crates.io automatically.