2018-09-28 15:01:27 +00:00
|
|
|
# salsa
|
|
|
|
|
2018-11-01 09:04:55 +00:00
|
|
|
[![Build Status](https://travis-ci.org/salsa-rs/salsa.svg?branch=master)](https://travis-ci.org/salsa-rs/salsa)
|
|
|
|
[![Released API docs](https://docs.rs/salsa/badge.svg)](https://docs.rs/salsa)
|
|
|
|
[![Crates.io](https://img.shields.io/crates/v/salsa.svg)](https://crates.io/crates/salsa)
|
|
|
|
|
2018-09-28 15:01:27 +00:00
|
|
|
*A generic framework for on-demand, incrementalized computation.*
|
|
|
|
|
|
|
|
## Obligatory warning
|
|
|
|
|
2018-10-01 13:09:02 +00:00
|
|
|
Very much a WORK IN PROGRESS at this point. Ready for experimental use
|
|
|
|
but expect frequent breaking changes.
|
2018-09-28 15:01:27 +00:00
|
|
|
|
|
|
|
## Credits
|
|
|
|
|
2018-12-16 03:29:31 +00:00
|
|
|
This system is heavily inspired by [adapton](http://adapton.org/), [glimmer](https://github.com/glimmerjs/glimmer-vm), and rustc's query
|
2018-09-28 15:01:27 +00:00
|
|
|
system. So credit goes to Eduard-Mihai Burtescu, Matthew Hammer,
|
|
|
|
Yehuda Katz, and Michael Woerister.
|
|
|
|
|
2018-10-02 00:42:41 +00:00
|
|
|
## Key idea
|
|
|
|
|
2018-10-05 15:03:51 +00:00
|
|
|
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:
|
2018-10-02 00:42:41 +00:00
|
|
|
|
|
|
|
- **Inputs**: the base inputs to your system. You can change these
|
|
|
|
whenever you like.
|
2018-10-02 09:50:38 +00:00
|
|
|
- **Functions**: pure functions (no side effects) that transform your
|
|
|
|
inputs into other values. The results of queries is 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.
|
2018-10-02 00:42:41 +00:00
|
|
|
|
|
|
|
## How to use Salsa in three easy steps
|
|
|
|
|
|
|
|
Using salsa is as easy as 1, 2, 3...
|
|
|
|
|
2018-10-05 15:03:51 +00:00
|
|
|
1. Define one or more **query groups** that contain the inputs
|
|
|
|
and queries you will need. We'll start with one such group, but
|
2018-10-02 00:42:41 +00:00
|
|
|
later on you can use more than one to break up your system into
|
|
|
|
components (or spread your code across crates).
|
2018-10-05 15:03:51 +00:00
|
|
|
2. Define the **query functions** where appropriate.
|
|
|
|
3. Define the **database**, which contains the storage for all
|
2018-10-05 08:54:51 +00:00
|
|
|
the inputs/queries you will be using. The query struct will contain
|
|
|
|
the storage for all of the inputs/queries and may also contain
|
|
|
|
anything else that your code needs (e.g., configuration data).
|
2018-10-09 19:42:07 +00:00
|
|
|
|
2018-10-02 09:50:38 +00:00
|
|
|
To see an example of this in action, check out [the `hello_world`
|
|
|
|
example](examples/hello_world/main.rs), which has a number of comments
|
2019-01-25 10:16:57 +00:00
|
|
|
explaining how things work.
|
2018-10-02 00:42:41 +00:00
|
|
|
|
2019-01-29 20:16:20 +00:00
|
|
|
## Videos about Salsa
|
|
|
|
|
|
|
|
There are also two videos explaining how Salsa works:
|
|
|
|
|
|
|
|
- [How Salsa Works](https://youtu.be/_muY4HjSqVw), which gives a
|
|
|
|
high-level introduction to the key concepts involved and shows how
|
|
|
|
to use salsa;
|
|
|
|
- [Salsa In More Depth](https://www.youtube.com/watch?v=i_IhACacPRY),
|
|
|
|
which really digs into the incremental algorithm and explains -- at
|
|
|
|
a high-level -- how Salsa is implemented.
|
2018-10-09 19:42:07 +00:00
|
|
|
|
2018-10-11 13:18:58 +00:00
|
|
|
## Getting in touch
|
|
|
|
|
|
|
|
The bulk of the discussion happens in the [issues](https://github.com/salsa-rs/salsa/issues)
|
|
|
|
and [pull requests](https://github.com/salsa-rs/salsa/pulls),
|
|
|
|
but we have a [zulip chat](https://salsa.zulipchat.com/) as well.
|
|
|
|
|