# streaming-nonempty
A correct _groupBy_ function is expected to produce only non-empty groups, which means we should be able to fold them up with only Semigroup constraint on the values. This is not the case for `Data.List.groupBy` as well for the Streaming lib counterpart.
This package export a _groupBy_ function that produce `f (Stream f m a)` groups which are then guaranteed to have the functorial layer.
The `NEStream (Of a) m r` newtype is supporting _sconcat_ which means we can define
```haskell
groupSemigroupBy :: (Semigroup a, Monad m) => (a -> a -> Bool) -> Stream (Of a) m r -> Stream (Of a) m r
groupSemigroupBy f = S.mapped sconcat . groupBy f
```
with expected behavior to collapse groups using semigroup composition
In contrast using the standard _groupBy_ we are stuck with
```haskell
groupMonoidBy :: (Monoid a, Monad m) => (a -> a -> Bool) -> Stream (Of a) m r -> Stream (Of a) m r
groupMonoidBy f = S.mapped mconcat . groupBy f
```
It would be legit to use an `sconcatUnsafe` that would panic on empty streams because *we know* groups are not empty.