GoCollections/collections/Iterable.go

132 lines
3.0 KiB
Go
Raw Normal View History

2021-05-20 17:32:35 +08:00
package collections
2021-05-21 11:14:07 +08:00
import "github.com/tursom/GoCollections/exceptions"
2021-05-20 17:32:35 +08:00
type Iterator interface {
HasNext() bool
2021-05-21 16:57:33 +08:00
Next() (interface{}, exceptions.Exception)
2021-05-20 17:32:35 +08:00
}
type Iterable interface {
Iterator() Iterator
}
type MutableIterator interface {
HasNext() bool
2021-05-21 16:57:33 +08:00
Next() (interface{}, exceptions.Exception)
Remove() exceptions.Exception
2021-05-20 17:32:35 +08:00
}
type MutableIterable interface {
Iterator() Iterator
MutableIterator() MutableIterator
}
2021-05-21 16:57:33 +08:00
func Loop(iterable Iterable, f func(element interface{}) exceptions.Exception) exceptions.Exception {
if f == nil || iterable == nil {
return exceptions.NewNPE("", true)
}
return LoopIterator(iterable.Iterator(), f)
}
2021-06-28 10:39:59 +08:00
func LoopMutable(
iterable MutableIterable,
f func(element interface{}, iterator MutableIterator) (err exceptions.Exception),
) exceptions.Exception {
2021-05-21 16:57:33 +08:00
if f == nil || iterable == nil {
return exceptions.NewNPE("", true)
}
return LoopMutableIterator(iterable.MutableIterator(), f)
}
func LoopIterator(iterator Iterator, f func(element interface{}) exceptions.Exception) exceptions.Exception {
if f == nil || iterator == nil {
2021-05-21 11:14:07 +08:00
return exceptions.NewNPE("", true)
2021-05-20 17:32:35 +08:00
}
for iterator.HasNext() {
2021-05-21 09:41:58 +08:00
next, err := iterator.Next()
if err != nil {
return err
}
err = f(next)
2021-05-20 17:32:35 +08:00
if err != nil {
return err
}
}
return nil
}
2021-06-28 10:39:59 +08:00
func LoopMutableIterator(
iterator MutableIterator,
f func(element interface{}, iterator MutableIterator) (err exceptions.Exception),
) exceptions.Exception {
2021-05-21 16:57:33 +08:00
if f == nil || iterator == nil {
return exceptions.NewNPE("", true)
2021-05-20 17:32:35 +08:00
}
for iterator.HasNext() {
2021-05-21 09:41:58 +08:00
next, err := iterator.Next()
if err != nil {
return err
}
err = f(next, iterator)
2021-05-20 17:32:35 +08:00
if err != nil {
return err
}
}
return nil
}
2021-05-22 17:10:26 +08:00
func Size(iterable Iterable) (size uint32, err exceptions.Exception) {
iterator := iterable.Iterator()
for iterator.HasNext() {
_, err = iterator.Next()
if err != nil {
return
}
size++
}
return
}
func Contains(l Iterable, element interface{}) bool {
return Loop(l, func(e interface{}) exceptions.Exception {
if e == element {
return exceptions.ElementFound
}
return nil
}) != nil
}
func Remove(l MutableIterable, element interface{}) exceptions.Exception {
return LoopMutable(l, func(e interface{}, iterator MutableIterator) (err exceptions.Exception) {
if element == e {
return iterator.Remove()
}
return nil
})
}
func RemoveAll(l MutableIterable, collection Collection) bool {
return LoopMutable(l, func(element interface{}, iterator MutableIterator) (err exceptions.Exception) {
if collection.Contains(element) {
return iterator.Remove()
}
return nil
}) == nil
}
func RetainAll(l MutableIterable, collection Collection) bool {
return LoopMutable(l, func(element interface{}, iterator MutableIterator) exceptions.Exception {
if !collection.Contains(element) {
return iterator.Remove()
}
return nil
}) == nil
}
func Clear(l MutableIterable) exceptions.Exception {
return LoopMutable(l, func(element interface{}, iterator MutableIterator) (err exceptions.Exception) {
return iterator.Remove()
})
}