Skip to content

Commit

Permalink
add filter function (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
mikehelmick authored Oct 24, 2023
1 parent fd55be2 commit 0080a19
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 0 deletions.
27 changes: 27 additions & 0 deletions slice/filter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright 2023 the go-functional authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package slice

// Filter returns a new slice of only the elements in the list
// that match the provided matchFn.
func Filter[T any](in []T, matchFn MatchFn[T]) []T {
rtn := make([]T, 0, len(in))
for _, e := range in {
if matchFn(e) {
rtn = append(rtn, e)
}
}
return rtn
}
71 changes: 71 additions & 0 deletions slice/filter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Copyright 2023 the go-functional authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package slice_test

import (
"fmt"

"github.com/mikehelmick/go-functional/slice"
)

func ExampleFilter() {
type Account struct {
Name string
Writer bool
}

input := []*Account{
{
Name: "Bob",
Writer: false,
},
{
Name: "Alice",
Writer: true,
},
{
Name: "Steve",
Writer: false,
},
}

// Function to check if an element is even
isWriter := func(x *Account) bool {
return x.Writer
}

writers := slice.Filter(input, isWriter)
fmt.Printf("Writers:\n")
for _, writer := range writers {
fmt.Printf(" - name: %v\n", writer.Name)
}

isReadOnly := func(x *Account) bool {
return !x.Writer
}

readers := slice.Filter(input, isReadOnly)
fmt.Printf("Readers:\n")
for _, reader := range readers {
fmt.Printf(" - name: %v\n", reader.Name)
}

// Output:
// Writers:
// - name: Alice
// Readers:
// - name: Bob
// - name: Steve
}

0 comments on commit 0080a19

Please sign in to comment.