Skip to content

Commit

Permalink
math functions
Browse files Browse the repository at this point in the history
  • Loading branch information
EliCDavis committed Aug 11, 2023
1 parent be55771 commit 8ac2898
Show file tree
Hide file tree
Showing 14 changed files with 185 additions and 28 deletions.
15 changes: 2 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func main() {

### Range

Range is a bound iteractor that counts up from 0 to n-1 the value specified
Range is a bound iterator that emits values incrementally starting from 0 and increasing to n-1, with n being the value specified in the Range constructor.

```golang
package main
Expand All @@ -85,18 +85,7 @@ import (
)

func main() {
arr := iter.Range(5)

sum := 0
for {
val, err := arr.Next()
if err != nil {
break
}
sum += val
}

// Prints: 10 (0 + 1 + 2 + 3 + 4)
fmt.Println(sum)
fmt.Println(iter.Sum(iter.Range(5)))
}
```
4 changes: 2 additions & 2 deletions array_iterator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ type ArrayIterator[T any] struct {
pointer int
}

func Array[T any](data []T) ArrayIterator[T] {
return ArrayIterator[T]{
func Array[T any](data []T) *ArrayIterator[T] {
return &ArrayIterator[T]{
data: data,
}
}
Expand Down
3 changes: 3 additions & 0 deletions errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ var ErrAtEnd = errors.New("iterator is at the end")
// Error to indicate that the bound iterator is attempting to have an element
// accessed that is out of it's bounds.
var ErrNotInBounds = errors.New("index is outside of iterator bounds")

// Error to indicate the value passed into the Range iterator is invalid.
var ErrInvalidRangeValue = errors.New("range iterator can not be constructed with values less than 0")
4 changes: 2 additions & 2 deletions iterops/chunk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

func TestChunk(t *testing.T) {
arr := iter.Array([]int{1, 2, 3, 4, 5})
chunkedIterator := iterops.Chunk[int](&arr, 2)
chunkedIterator := iterops.Chunk[int](arr, 2)

mappedData := iter.ReadFull(chunkedIterator)

Expand All @@ -22,7 +22,7 @@ func TestChunk(t *testing.T) {

func TestChunkPerfect(t *testing.T) {
arr := iter.Array([]int{1, 2, 3, 4, 5, 6})
chunkedIterator := iterops.Chunk[int](&arr, 2)
chunkedIterator := iterops.Chunk[int](arr, 2)

mappedData := iter.ReadFull(chunkedIterator)

Expand Down
4 changes: 2 additions & 2 deletions iterops/filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import (
func TestFilter(t *testing.T) {
arr := iter.Array([]int{1, 2, 3, 4, 5})

mapper := iterops.Filter[int](&arr, func(i int) bool {
return i % 2 == 0
mapper := iterops.Filter[int](arr, func(i int) bool {
return i%2 == 0
})

mappedData := iter.ReadFull(mapper)
Expand Down
2 changes: 1 addition & 1 deletion iterops/flatten_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func TestFlatten(t *testing.T) {
{},
})

flatten := iterops.Flatten[int](&arr)
flatten := iterops.Flatten[int](arr)

flattenData := iter.ReadFull(flatten)

Expand Down
2 changes: 1 addition & 1 deletion iterops/maps_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
func TestMap(t *testing.T) {
arr := iter.Array([]string{"1", "2", "3", "4", "5"})

mapper := iterops.Map[string, int](&arr, func(s string) int {
mapper := iterops.Map[string, int](arr, func(s string) int {
parsed, _ := strconv.Atoi(s)
return parsed
})
Expand Down
2 changes: 1 addition & 1 deletion iterops/scan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
func TestScan(t *testing.T) {
arr := iter.Array([]int{1, 2, 3, 4})

mapper := iterops.Scan[int](&arr, func(cur, acc int) int {
mapper := iterops.Scan[int](arr, func(cur, acc int) int {
return cur + acc
})

Expand Down
4 changes: 2 additions & 2 deletions iterops/zip_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ func TestZip(t *testing.T) {
arrA := iter.Array([]int{1, 2, 3, 4, 5})
arrB := iter.Array([]string{"A", "B", "C", "D", "E"})

mapper := iterops.Zip[int, string, string](&arrA, &arrB, func(i int, s string) string {
mapper := iterops.Zip[int, string, string](arrA, arrB, func(i int, s string) string {
return fmt.Sprintf("%d%s", i, s)
})

Expand All @@ -26,7 +26,7 @@ func TestZipStreamEndsEarly(t *testing.T) {
arrA := iter.Array([]int{1, 2, 3, 4, 5})
arrB := iter.Array([]string{"A", "B", "C", "D"})

mapper := iterops.Zip[int, string, string](&arrA, &arrB, func(i int, s string) string {
mapper := iterops.Zip[int, string, string](arrA, arrB, func(i int, s string) string {
return fmt.Sprintf("%d%s", i, s)
})

Expand Down
106 changes: 106 additions & 0 deletions math.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package iter

import "math"

type Number interface {
float32 | float64 | int | int32 | int64
}

func Sum[T Number](i Iterator[T]) T {
var sum T
for {
val, err := i.Next()
if err != nil {
break
}
sum += val
}
return sum
}

func Min[T Number](i Iterator[T]) T {
var min T

switch i.(type) {
case Iterator[int]:
max := math.MaxInt
min = T(max)

case Iterator[int32]:
min = T(math.MaxInt32)

case Iterator[int64]:
max := math.MaxInt64
min = T(max)

case Iterator[float32]:
max := math.MaxFloat32
min = T(max)

case Iterator[float64]:
max := math.MaxFloat64
min = T(max)
}

for {
val, err := i.Next()
if err != nil {
break
}
if min > val {
min = val
}
}
return min
}

func Max[T Number](i Iterator[T]) T {
var max T

switch i.(type) {
case Iterator[int]:
min := math.MinInt
max = T(min)

case Iterator[int32]:
max = T(math.MinInt32)

case Iterator[int64]:
min := math.MinInt64
max = T(min)

case Iterator[float32]:
min := -math.MaxFloat32
max = T(min)

case Iterator[float64]:
min := -math.MaxFloat64
max = T(min)
}

for {
val, err := i.Next()
if err != nil {
break
}
if max < val {
max = val
}

}
return max
}

func Average[T Number](i Iterator[T]) float64 {
var sum T
count := 0.
for {
val, err := i.Next()
if err != nil {
break
}
sum += val
count++
}
return float64(sum) / count
}
50 changes: 50 additions & 0 deletions math_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package iter_test

import (
"testing"

"github.com/EliCDavis/iter"
"github.com/stretchr/testify/assert"
)

func TestSum(t *testing.T) {
assert.Equal(t, 10, iter.Sum(iter.Range(5)))
}

func TestAverage(t *testing.T) {
assert.Equal(t, 2., iter.Average(iter.Range(5)))
}

func TestMin(t *testing.T) {
assert.Equal(t, 3, iter.Min(iter.Array([]int{5, 4, 3, 4, 5})))
assert.Equal(t, -5, iter.Min(iter.Array([]int{-5, -4, -3, -4, -5})))

assert.Equal(t, int32(3), iter.Min(iter.Array([]int32{5, 4, 3, 4, 5})))
assert.Equal(t, int32(-5), iter.Min(iter.Array([]int32{-5, -4, -3, -4, -5})))

assert.Equal(t, int64(3), iter.Min(iter.Array([]int64{5, 4, 3, 4, 5})))
assert.Equal(t, int64(-5), iter.Min(iter.Array([]int64{-5, -4, -3, -4, -5})))

assert.Equal(t, float32(3), iter.Min(iter.Array([]float32{5, 4, 3, 4, 5})))
assert.Equal(t, float32(-5), iter.Min(iter.Array([]float32{-5, -4, -3, -4, -5})))

assert.Equal(t, 3., iter.Min(iter.Array([]float64{5, 4, 3, 4, 5})))
assert.Equal(t, -5., iter.Min(iter.Array([]float64{-5, -4, -3, -4, -5})))
}

func TestMax(t *testing.T) {
assert.Equal(t, 5, iter.Max(iter.Array([]int{3, 4, 5, 4, 3})))
assert.Equal(t, -3, iter.Max(iter.Array([]int{-3, -4, -5, -4, -3})))

assert.Equal(t, int32(5), iter.Max(iter.Array([]int32{3, 4, 5, 4, 3})))
assert.Equal(t, int32(-3), iter.Max(iter.Array([]int32{-3, -4, -5, -4, -3})))

assert.Equal(t, int64(5), iter.Max(iter.Array([]int64{3, 4, 5, 4, 3})))
assert.Equal(t, int64(-3), iter.Max(iter.Array([]int64{-3, -4, -5, -4, -3})))

assert.Equal(t, float32(5), iter.Max(iter.Array([]float32{3, 4, 5, 4, 3})))
assert.Equal(t, float32(-3), iter.Max(iter.Array([]float32{-3, -4, -5, -4, -3})))

assert.Equal(t, 5., iter.Max(iter.Array([]float64{3, 4, 5, 4, 3})))
assert.Equal(t, -3., iter.Max(iter.Array([]float64{-3, -4, -5, -4, -3})))
}
7 changes: 5 additions & 2 deletions range_iterator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ type RangeIterator struct {
pointer int
}

func Range(size int) RangeIterator {
return RangeIterator{
func Range(size int) *RangeIterator {
if size < 0 {
panic(ErrInvalidRangeValue)
}
return &RangeIterator{
size: size,
pointer: 0,
}
Expand Down
8 changes: 7 additions & 1 deletion range_iterator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func TestRange(t *testing.T) {
assert.Equal(t, 0, i.Current())

// test reading all elements
assert.Equal(t, []int{0, 1, 2, 3, 4}, iter.ReadFull[int](&i))
assert.Equal(t, []int{0, 1, 2, 3, 4}, iter.ReadFull[int](i))

// test at
assert.Equal(t, 0, i.At(0))
Expand All @@ -39,3 +39,9 @@ func TestRange(t *testing.T) {
i.At(-1)
})
}

func TestRangePanicsWithValueLessThan0(t *testing.T) {
assert.PanicsWithError(t, iter.ErrInvalidRangeValue.Error(), func() {
iter.Range(-1)
})
}
2 changes: 1 addition & 1 deletion read_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ import (
func TestReadFull(t *testing.T) {
original := []int{1, 2, 3, 4, 5}
i := iter.Array(original)
assert.Equal(t, original, iter.ReadFull[int](&i))
assert.Equal(t, original, iter.ReadFull[int](i))
}

0 comments on commit 8ac2898

Please # to comment.