The current behavior can result into wired edge cases.
**Current behavior**
if find was unsuccessfully then it will return the first element of the
slice
**Desired behavior**
if find was unsuccessfully then it should return negative ok and a none
value
Group by: split slice into two groups, applies on each slice element a
predicate func to categorize this element.
Changes
* Add groub by func
* Add test case for this func
IntSlice and StringSlice: preallocate memory up front for output slice.
Instead returning a error throw a panic because most likely it's a
programming error.
Contain: rename slice to iterableType and add default case for type
mismatches