# Set
Set is a data container, like list, but elements of set is not duplicate.
# Source
# Usage
import (
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
# Index
# Documentation
# NewSet
Make a Set instance
Signature:
type Set[T comparable] map[T]bool
func NewSet[T comparable](values ...T) Set[T]
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    st := set.NewSet[int](1,2,2,3)
    fmt.Println(st.Values()) //1,2,3
}
# Values
Return slice of all set data
Signature:
func (s Set[T]) Values() []T
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    st := set.NewSet[int](1,2,2,3)
    fmt.Println(st.Values()) //1,2,3
}
# Add
Add value to set
Signature:
func (s Set[T]) Add(values ...T)
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    st := set.NewSet[int]()
    st.Add(1, 2, 3)
    fmt.Println(st.Values()) //1,2,3
}
# Delete
Delete value in set
Signature:
func (s Set[T]) Delete(values ...T)
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    st := set.NewSet[int]()
    st.Add(1, 2, 3)
    set.Delete(3)
    fmt.Println(st.Values()) //1,2
}
# Contain
Check if value is in set or not
Signature:
func (s Set[T]) Contain(value T) bool
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    st := set.NewSet[int]()
    st.Add(1, 2, 3)
    fmt.Println(st.Contain(1)) //true
    fmt.Println(st.Contain(4)) //false
}
# ContainAll
Checks if set contains another set
Signature:
func (s Set[T]) ContainAll(other Set[T]) bool
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
	set2 := set.NewSet(1, 2)
	set3 := set.NewSet(1, 2, 3, 4)
    fmt.Println(set1.ContainAll(set2)) //true
    fmt.Println(set1.ContainAll(set3)) //false
}
# Size
Get the number of elements in set
Signature:
func (s Set[T]) Size() int
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
    fmt.Println(set1.Size()) //3
}
# Clone
Make a copy of set
Signature:
func (s Set[T]) Clone() Set[T]
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
    set2 := set1.Clone()
    fmt.Println(set1.Size() == set2.Size()) //true
    fmt.Println(set1.ContainAll(set2)) //true
}
# Equal
Check if two sets has same elements or not
Signature:
func (s Set[T]) Equal(other Set[T]) bool
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
    set2 := set.NewSet(1, 2, 3)
    set3 := set.NewSet(1, 2, 3, 4)
    fmt.Println(set1.Equal(set2)) //true
    fmt.Println(set1.Equal(set3)) //false
}
# Iterate
Call function by every element of set
Signature:
func (s Set[T]) Iterate(fn func(value T))
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
    arr := []int{}
    set.Iterate(func(value int) {
        arr = append(arr, value)
    })
    fmt.Println(arr) //1,2,3
}
# IsEmpty
Check if the set is empty or not
Signature:
func (s Set[T]) IsEmpty() bool
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
    set2 := set.NewSet()
    fmt.Println(set1.IsEmpty()) //false
    fmt.Println(set2.IsEmpty()) //true
}
# Union
Create a new set contain all element of set s and other
Signature:
func (s Set[T]) Union(other Set[T]) Set[T]
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
    set2 := set.NewSet(2, 3, 4, 5)
    set3 := set1.Union(set2)
    fmt.Println(set3.Values()) //1,2,3,4,5
}
# Intersection
Create a new set whose element both be contained in set s and other
Signature:
func (s Set[T]) Intersection(other Set[T]) Set[T]
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
    set2 := set.NewSet(2, 3, 4, 5)
    set3 := set1.Intersection(set2)
    fmt.Println(set3.Values()) //2,3
}
# SymmetricDifference
Create a new set whose element is in set1 or set2, but not in both set1 and set2
Signature:
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
	set2 := set.NewSet(2, 3, 4, 5)
	set3 := set1.SymmetricDifference(set2)
    fmt.Println(set3.Values()) //1,4,5
}
# Minus
Create an set of whose element in origin set but not in compared set
Signature:
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]
Example:
package main
import (
    "fmt"
    set "github.com/duke-git/lancet/v2/datastructure/set"
)
func main() {
    set1 := set.NewSet(1, 2, 3)
	set2 := set.NewSet(2, 3, 4, 5)
	set3 := set.NewSet(2, 3)
    res1 := set1.Minus(set2)
    fmt.Println(res1.Values()) //1
    res2 := set2.Minus(set3)
    fmt.Println(res2.Values()) //4,5
}