aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
authorMatt Joiner <anacrolix@gmail.com>2021-08-24 21:57:45 +1000
committerMatt Joiner <anacrolix@gmail.com>2021-08-24 21:57:45 +1000
commit19167a61a2c57caeda2eb7ce787c12e79d20c9ac (patch)
treeeb0fd307a670b1e0f79c45667b479957207138d5 /README.md
parentUpdate reference badge (diff)
downloadstm-19167a61a2c57caeda2eb7ce787c12e79d20c9ac.tar.gz
stm-19167a61a2c57caeda2eb7ce787c12e79d20c9ac.tar.xz
Create package-level example doc test from README
This should synchronize the examples more with the actual API by actually running them.
Diffstat (limited to 'README.md')
-rw-r--r--README.md82
1 files changed, 6 insertions, 76 deletions
diff --git a/README.md b/README.md
index 849897d..6330f79 100644
--- a/README.md
+++ b/README.md
@@ -29,86 +29,15 @@ applications in Go. If you find this package useful, please tell us about it!
## Examples
-Note that `Operation` now returns a value of type `interface{}`, which isn't included in the examples
-throughout the documentation yet. See the type signatures for `Atomically` and `Operation`.
-
-Here's some example code that demonstrates how to perform common operations:
-
-```go
-// create a shared variable
-n := stm.NewVar(3)
-
-// read a variable
-var v int
-stm.Atomically(func(tx *stm.Tx) {
- v = tx.Get(n).(int)
-})
-// or:
-v = stm.AtomicGet(n).(int)
-
-// write to a variable
-stm.Atomically(func(tx *stm.Tx) {
- tx.Set(n, 12)
-})
-// or:
-stm.AtomicSet(n, 12)
-
-// update a variable
-stm.Atomically(func(tx *stm.Tx) {
- cur := tx.Get(n).(int)
- tx.Set(n, cur-1)
-})
-
-// block until a condition is met
-stm.Atomically(func(tx *stm.Tx) {
- cur := tx.Get(n).(int)
- if cur != 0 {
- tx.Retry()
- }
- tx.Set(n, 10)
-})
-// or:
-stm.Atomically(func(tx *stm.Tx) {
- cur := tx.Get(n).(int)
- tx.Assert(cur == 0)
- tx.Set(n, 10)
-})
-
-// select among multiple (potentially blocking) transactions
-stm.Atomically(stm.Select(
- // this function blocks forever, so it will be skipped
- func(tx *stm.Tx) { tx.Retry() },
-
- // this function will always succeed without blocking
- func(tx *stm.Tx) { tx.Set(n, 10) },
-
- // this function will never run, because the previous
- // function succeeded
- func(tx *stm.Tx) { tx.Set(n, 11) },
-))
-
-// since Select is a normal transaction, if the entire select retries
-// (blocks), it will be retried as a whole:
-x := 0
-stm.Atomically(stm.Select(
- // this function will run twice, and succeed the second time
- func(tx *stm.Tx) { tx.Assert(x == 1) },
-
- // this function will run once
- func(tx *stm.Tx) {
- x = 1
- tx.Retry()
- },
-))
-// But wait! Transactions are only retried when one of the Vars they read is
-// updated. Since x isn't a stm Var, this code will actually block forever --
-// but you get the idea.
-```
+See the package examples in the Go package docs for examples of common operations.
See [example_santa_test.go](example_santa_test.go) for a more complex example.
## Pointers
+Note that `Operation` now returns a value of type `interface{}`, which isn't included in the
+examples throughout the documentation yet. See the type signatures for `Atomically` and `Operation`.
+
Be very careful when managing pointers inside transactions! (This includes
slices, maps, channels, and captured variables.) Here's why:
@@ -191,4 +120,5 @@ BenchmarkReadVarChannel-4 10000 240086 ns/op
## Credits
-Package stm was [originally](https://github.com/lukechampine/stm/issues/3#issuecomment-549087541) created by lukechampine.
+Package stm was [originally](https://github.com/lukechampine/stm/issues/3#issuecomment-549087541)
+created by lukechampine.