# `Talan.Stream`
[🔗](https://github.com/preciz/talan/blob/v1.0.0/lib/talan/stream.ex#L1)

Utilities for probabilistic stream processing.

# `stream`

```elixir
@type stream() :: %Stream{accs: term(), done: term(), enum: term(), funs: term()}
```

# `uniq`

```elixir
@spec uniq(Enumerable.t(), Talan.BloomFilter.t()) :: stream()
```

Returns a stream that probabilistically removes duplicates.

Its main advantage is that it doesn't store elements
emitted by the stream.
Instead it uses a Bloom filter for membership checks.

The stream never returns duplicate elements but it
sometimes detects false-positive duplicates depending
on the Bloom filter it uses.
A false positive causes a unique element to be incorrectly
rejected as a duplicate.

This mutates `bloom_filter`. Re-enumerating the returned stream may produce
different results because previously emitted elements remain recorded.

## Examples

    iex> list = ["a", "b", "c", "a", "b"]
    iex> bloom_filter = Talan.BloomFilter.new(100_000, false_positive_probability: 0.001)
    iex> Talan.Stream.uniq(list, bloom_filter) |> Enum.to_list()
    ["a", "b", "c"]

---

*Consult [api-reference.md](api-reference.md) for complete listing*
