Skip to content

Commit

Permalink
Merge pull request #17 from azihsoyn/feature/ResultAs
Browse files Browse the repository at this point in the history
support ResultAs
  • Loading branch information
azihsoyn authored Nov 29, 2016
2 parents 2cfc51b + 431fdc1 commit ca5a256
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 16 deletions.
4 changes: 4 additions & 0 deletions distinct_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ func TestDistinct_HavingError(t *testing.T) {
assert := assert.New(t)
_, err := gollection.New("not slice value").Distinct().Distinct().Result()
assert.Error(err)

res := []int{}
err = gollection.New("not slice value").Distinct().Distinct().ResultAs(&res)
assert.Error(err)
}

func TestDistinctBy(t *testing.T) {
Expand Down
45 changes: 45 additions & 0 deletions example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,48 @@ func Example_take() {
// Output: [1 2 3] <nil>
// [1 2 3 4 5 6 7 8 9 10] <nil>
}

func Example_customType() {
type User struct {
ID int
Name string
}

in := []User{
{ID: 1, Name: "aaa"},
{ID: 2, Name: "bbb"},
{ID: 3, Name: "ccc"},
{ID: 4, Name: "ddd"},
{ID: 5, Name: "eee"},
{ID: 6, Name: "fff"},
{ID: 7, Name: "ggg"},
}
res, err := gollection.New(in).Filter(func(v User) bool {
return v.ID > 5
}).Result()
fmt.Printf("%#v %#v\n", res.([]User), err)
// Output: []gollection_test.User{gollection_test.User{ID:6, Name:"fff"}, gollection_test.User{ID:7, Name:"ggg"}} <nil>
}

func Example_customTypeWithResultAs() {
type User struct {
ID int
Name string
}

in := []User{
{ID: 1, Name: "aaa"},
{ID: 2, Name: "bbb"},
{ID: 3, Name: "ccc"},
{ID: 4, Name: "ddd"},
{ID: 5, Name: "eee"},
{ID: 6, Name: "fff"},
{ID: 7, Name: "ggg"},
}
var res []User
err := gollection.New(in).Filter(func(v User) bool {
return v.ID > 5
}).ResultAs(&res)
fmt.Printf("%#v %#v\n", res, err)
// Output: []gollection_test.User{gollection_test.User{ID:6, Name:"fff"}, gollection_test.User{ID:7, Name:"ggg"}} <nil>
}
36 changes: 36 additions & 0 deletions examples/custom_type/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package main

import (
"fmt"

"github.com/azihsoyn/gollection"
)

type User struct {
ID int
Name string
}

func main() {
in := []User{
{ID: 1, Name: "aaa"},
{ID: 2, Name: "bbb"},
{ID: 3, Name: "ccc"},
{ID: 4, Name: "ddd"},
{ID: 5, Name: "eee"},
{ID: 6, Name: "fff"},
{ID: 7, Name: "ggg"},
}
var out []User
err := gollection.New(in).Filter(func(v User) bool {
return v.ID > 5
}).ResultAs(&out)
fmt.Printf("out with ResultAs : %#v\n", out)
fmt.Println("err : ", err)

ret, _ := gollection.New(in).Filter(func(v User) bool {
return v.ID > 5
}).Result()
out = ret.([]User)
fmt.Printf("out with type assertion : %#v\n", out)
}
17 changes: 9 additions & 8 deletions fold_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func TestFold(t *testing.T) {
assert.NoError(err)
assert.Equal(expect, res)
}

func TestFold_NotSlice(t *testing.T) {
assert := assert.New(t)
_, err := gollection.New("not slice value").Fold(100, func(v1, v2 interface{}) interface{} {
Expand All @@ -44,11 +45,11 @@ func TestFold_HavingError(t *testing.T) {
assert := assert.New(t)
_, err := gollection.New("not slice value").
Fold(100, func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Fold(100, func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Result()
assert.Error(err)
}
Expand Down Expand Up @@ -90,11 +91,11 @@ func TestFold_Stream_HavingError(t *testing.T) {
assert := assert.New(t)
_, err := gollection.NewStream("not slice value").
Fold(100, func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Fold(100, func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Result()
assert.Error(err)
}
19 changes: 19 additions & 0 deletions gollection.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,25 @@ func (g *gollection) result() (interface{}, error) {
return g.slice, g.err
}

func (g *gollection) ResultAs(out interface{}) error {
if g.err != nil {
return g.err
}

iv := reflect.ValueOf(g.slice)
if g.val != nil {
iv = reflect.ValueOf(g.val)
}

ov := reflect.ValueOf(out)
if ov.Kind() != reflect.Ptr || iv.Type() != ov.Elem().Type() {
return fmt.Errorf("gollection.ResultAs called with unexpected type %T, expected %s", g.slice, ov.Elem().Type())
}

ov.Elem().Set(iv)
return nil
}

func (g *gollection) resultStream() (interface{}, error) {
var ret reflect.Value
var initialized bool
Expand Down
17 changes: 17 additions & 0 deletions gollection_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package gollection_test

import (
"testing"

"github.com/azihsoyn/gollection"
"github.com/stretchr/testify/assert"
)

func TestResultAs_UnexpectedType(t *testing.T) {
assert := assert.New(t)
arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
res := []string{}

err := gollection.New(arr).ResultAs(&res)
assert.Error(err)
}
23 changes: 15 additions & 8 deletions reduce_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ func TestReduce(t *testing.T) {
assert.NoError(err)
assert.Equal(expect, res)

var ret int
err = gollection.New(arr).Reduce(func(v1, v2 int) int {
return v1 + v2
}).ResultAs(&ret)
assert.NoError(err)
assert.Equal(expect, ret)

arr = []int{1}
expect = 1

Expand Down Expand Up @@ -53,11 +60,11 @@ func TestReduce_HavingError(t *testing.T) {
assert := assert.New(t)
_, err := gollection.New("not slice value").
Reduce(func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Reduce(func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Result()
assert.Error(err)
}
Expand Down Expand Up @@ -108,11 +115,11 @@ func TestReduce_Stream_HavingError(t *testing.T) {
assert := assert.New(t)
_, err := gollection.NewStream("not slice value").
Reduce(func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Reduce(func(v1, v2 interface{}) interface{} {
return ""
}).
return ""
}).
Result()
assert.Error(err)
}

0 comments on commit ca5a256

Please sign in to comment.