[go: nahoru, domu]

Skip to content

beeleelee/list

Repository files navigation

Package list

list provide some useful utilities

in order to manipulate collection conveniently

in the form of functional programming

hope it will be helpful

Example


    import (

	"fmt"
	lee "github.com/beeleelee/list"

    )

    func main() {

	intList, _ := lee.From([]int{0,1,2})
	// list.Each
	intList.Each(func(v lee.Item, i int){
		fmt.Println(v, i)
	})
	// lee.Each(intList, func(v lee.Item, i int){
	// 	fmt.Println(v, i)
	// })

	//	0 0
	//	1 1
	//	2 2

	// list.Map
	intListMapped := intList.Map(func(v lee.Item, i int) lee.Item {
		return v.(int) * 2
	})
	// intListMapped := lee.Map(intList, func(v lee.Item, i int) lee.Item {
	// 	return v.(int) * 2
	// })

	fmt.Println(intListMapped)
	// [0 2 4]

	// list.Filter
	intListFiltered := intList.Filter(func(v lee.Item, i int) bool {
		return v.(int) % 2 == 1
	})

	// intListFiltered := lee.Filter(intList, func(v lee.Item, i int) bool {
	// 	return v.(int) % 2 == 1
	// })

	fmt.Println(intListFiltered)
	// [1]

	lee.FromInts([]int{1,2,3,4,5})
		.Reduce(func(a, b lee.Item) lee.Item {
			return a.(int) + b.(int)
		}, nil)
	// 15

	lee.FromInts([]int{3,6,9,12})
		.Intersection(leeFromInts([]{2,4,6,8,10,12}), func(a, b lee.Item) bool {
			return a == b
		})
	// [6,12]

    } 

FUNCTIONS

func Contains(list List, f ItemTestFn) (r bool) Contains - like Find

return true if find the item return false if can not find the item

func Each(list List, f EachFn) Each - each loop

use for loop to get item from list and feed item to EachFn

func Equal(s, t List, f EqualFn) (r bool) Equal - a way to compare whether two list is equal

it accept a EqualFn which handle the equal logic

func Every(list List, f ItemTestFn) (r bool) Every - return true if every item pass test

func FindIndex(list List, f ItemTestFn) (index int) FindIndex - a way to find the index of a specific item

it return -1 if could not find the item
it accept a ItemTestFn which will specific the item

func IsSorted(list List, f LessFn) bool IsSorted - convenience wrapper for std sort.SliceIsSorted

func Some(list List, f ItemTestFn) (r bool) Some - return true if any item pass test

func Sort(list List, f LessFn) Sort - convenience wrapper for std sort.Slice

TYPES

type EachFn func(Item, int) EachFn each loop handle signature

func(v Item, i int){

// switch value to the expected type
sv, _ := v.(int) // just for example, actually can use any type you specified
fmt.Println(sv)

}

type EqualFn func(a, b Item) bool EqualFn compare handle signature

func(a, b Item) bool {

return a == b

}

type Item interface{} Item - generic type for list item

in order to accept any type of item in collection

func Find(list List, f ItemTestFn) (r Item, ok bool) Find - like FindIndex, but not return index of item

it returns the specific item and ok flag

func Get(list List, i int) Item Get - get item from list it can accept negative int as index, like -1 attention: it will never failed if then index out of range, or no item in list, it will return nil

func Reduce(list List, f ReduceFn, a Item) (r Item) Reduce - fold the list

type ItemTestFn func(Item, int) bool ItemTestFn filter loop handle signature

func(v Item, i int) bool {

sv := v.(string)
return sv == "foo"

}

type LessFn func(i, j int) bool LessFn same signature as sort.Less

type List []Item List a struct wrap collection in Data field

func Difference(s List, t List, f EqualFn) (r List) Difference - return a list with items not in the other list

func Filter(list List, f ItemTestFn) List Filter - filter loop

first create a new list then use each loop to get item from list and
feed item to ItemTestFn which decide weather keep it or not

func From(source interface{}) (nl List, e error) From - convert regular slice to List

as do not know the item type in the slic
so use reflect package to get the item type
and rebuild a new slice with Item type

call it like this:
list.From([]int{1,2,3})

func FromFloat64s(source []float64) (nl List) FromFloat64s convert float64 slice to List

func FromInts(source []int) (nl List) FromInts convert int slice to List

func FromStrings(source []string) (nl List) FromStrings convert string slice to List

func Intersection(s List, t List, f EqualFn) (r List) Intersection - return a list with items in both list

func Map(list List, f MapFn) List Map - map loop

use for loop to get item from list and feed item to MapFn

func New(length int) List New generate a new List instance

func Shuffle(list List) (r List) Shuffle - return a shuffled list

func Tail(list List, n int) List Tail - get items from last

func Union(s List, t List) List Union - union two lists

func (l List) Contains(f ItemTestFn) bool Contains convenience wrapper for Contains function

func (l List) Difference(t List, f EqualFn) List Difference convenience wrapper for Difference Function

func (l List) Each(f EachFn) List Each convenience wrapper for Each function

func (l List) Equal(t List, f EqualFn) bool Equal convenience wrapper for Equal function

func (l List) Every(f ItemTestFn) bool Every convenience wrapper for Every Function

func (l List) Filter(f ItemTestFn) List Filter convenience wrapper for Filter function

func (l List) Find(f ItemTestFn) (Item, bool) Find convenience wrapper for Find function

func (l List) FindIndex(f ItemTestFn) int FindIndex convenience wrapper for FindIndex function

func (l List) Get(i int) Item Get convenience wrapper for Get Function

func (l List) Intersection(t List, f EqualFn) List Intersection convenience wrapper for Intersection Function

func (l List) IsSorted(f LessFn) bool IsSorted convenience wrapper for std sort.SliceIsSorted

func (l List) Map(f MapFn) List Map convenience wrapper for Map function

func (l List) Reduce(f ReduceFn, a Item) Item Reduce convenience wrapper for Reduce function

func (l List) Shuffle() List Shuffle convenience wrapper for Shuffle Function

func (l List) Some(f ItemTestFn) bool Some convenience wrapper for Some Function

func (l List) Sort(f LessFn) List Sort convenience wrapper for std sort.Slice

func (l List) Tail(n int) List Tail convenience wrapper for Tail Function

func (l List) Union(t List) List Union convenience wrapper for Union Function

type MapFn func(Item, int) Item MapFn map loop handle signature

func(v Item, i int) (item Item) {

sv, _ := v.(float64)
return sv * sv

}

type ReduceFn func(a, b Item) Item ReduceFn reduce handle signature

type SwapFn func(i, j int) SwapFn swap items by index