github.com/JimmyHuang454/JLS-go@v0.0.0-20230831150107-90d536585ba0/internal/types/testdata/check/slices.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package slices implements various slice algorithms. 6 package slices 7 8 // Map turns a []T1 to a []T2 using a mapping function. 9 func Map[T1, T2 any](s []T1, f func(T1) T2) []T2 { 10 r := make([]T2, len(s)) 11 for i, v := range s { 12 r[i] = f(v) 13 } 14 return r 15 } 16 17 // Reduce reduces a []T1 to a single value using a reduction function. 18 func Reduce[T1, T2 any](s []T1, initializer T2, f func(T2, T1) T2) T2 { 19 r := initializer 20 for _, v := range s { 21 r = f(r, v) 22 } 23 return r 24 } 25 26 // Filter filters values from a slice using a filter function. 27 func Filter[T any](s []T, f func(T) bool) []T { 28 var r []T 29 for _, v := range s { 30 if f(v) { 31 r = append(r, v) 32 } 33 } 34 return r 35 } 36 37 // Example uses 38 39 func limiter(x int) byte { 40 switch { 41 case x < 0: 42 return 0 43 default: 44 return byte(x) 45 case x > 255: 46 return 255 47 } 48 } 49 50 var input = []int{-4, 68954, 7, 44, 0, -555, 6945} 51 var limited1 = Map[int, byte](input, limiter) 52 var limited2 = Map(input, limiter) // using type inference 53 54 func reducer(x float64, y int) float64 { 55 return x + float64(y) 56 } 57 58 var reduced1 = Reduce[int, float64](input, 0, reducer) 59 var reduced2 = Reduce(input, 1i /* ERROR overflows */, reducer) // using type inference 60 var reduced3 = Reduce(input, 1, reducer) // using type inference 61 62 func filter(x int) bool { 63 return x&1 != 0 64 } 65 66 var filtered1 = Filter[int](input, filter) 67 var filtered2 = Filter(input, filter) // using type inference 68