## What is this?
ivar-simple provides immutable, write-once variables (`IVar`s) in the
`Data.IVar.Simple` module.
It also provides two more experimental channel implementations built on
top of `IVar`s,
* `Data.IVar.Simple.IChan`:
multi-cast channels with write-once semantics.
* `Data.IVar.Simple.MIChan`:
channels with write semantics similar to Control.Concurrent.Chan
## Comparison to data-ivar
Both data-ivar and ivar-simple provide a write-once variable. That's where
the similarities end:
* Reading an `IVar` with data-ivar is an `IO` operation. In ivar-simple it's
a pure function.
* data-ivar provides a `Reader` monoid, monad, etc. for reading from one of
several `IVar`s. ivar-simple has no such functionality.
* The data-ivar implementation can, in principle, add arbitrary `IO` actions
that are called when an `IVar` is written. (This detail is not exposed,
however)
* Technically, ivar-simple tries for efficiency by exploiting the existing
locking structures in the RTS; in particular, reading a full `IVar` for
a second time is as cheap as evaluating a record selector.
(I have no performance numbers for this.)