summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorDavid Symonds <dsymonds@golang.org>2009-04-20 18:13:14 -0700
committerDavid Symonds <dsymonds@golang.org>2009-04-20 18:13:14 -0700
commita0761e334aba87375c842ace499102c4622ecee9 (patch)
tree17208a76059f814a5b3a2b6db9a5a0836af13257 /src/lib
parent3d8743c037811e3957aacd05e7573938b8fa0297 (diff)
downloadgolang-a0761e334aba87375c842ace499102c4622ecee9.tar.gz
Move iterable package to usr/dsymonds/.
R=r APPROVED=r DELTA=598 (330 added, 266 deleted, 2 changed) OCL=27627 CL=27649
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/container/Makefile9
-rw-r--r--src/lib/container/iterable.go134
-rw-r--r--src/lib/container/iterable_test.go129
3 files changed, 2 insertions, 270 deletions
diff --git a/src/lib/container/Makefile b/src/lib/container/Makefile
index 66e9557bf..7edd3ebe8 100644
--- a/src/lib/container/Makefile
+++ b/src/lib/container/Makefile
@@ -44,12 +44,10 @@ O1=\
O2=\
intvector.$O\
- iterable.$O\
phases: a1 a2
_obj$D/vector.a: phases
-_obj$D/iterable.a: phases
a1: $(O1)
$(AR) grc _obj$D/vector.a vector.$O
@@ -57,25 +55,22 @@ a1: $(O1)
a2: $(O2)
$(AR) grc _obj$D/vector.a intvector.$O
- $(AR) grc _obj$D/iterable.a iterable.$O
rm -f $(O2)
newpkg: clean
mkdir -p _obj$D
$(AR) grc _obj$D/vector.a
- $(AR) grc _obj$D/iterable.a
$(O1): newpkg
$(O2): a1
$(O3): a2
nuke: clean
- rm -f $(GOROOT)/pkg$D/vector.a $(GOROOT)/pkg$D/iterable.a
+ rm -f $(GOROOT)/pkg$D/vector.a
-packages: _obj$D/vector.a _obj$D/iterable.a
+packages: _obj$D/vector.a
install: packages
test -d $(GOROOT)/pkg && mkdir -p $(GOROOT)/pkg$D
cp _obj$D/vector.a $(GOROOT)/pkg$D/vector.a
- cp _obj$D/iterable.a $(GOROOT)/pkg$D/iterable.a
diff --git a/src/lib/container/iterable.go b/src/lib/container/iterable.go
deleted file mode 100644
index bdcce11d0..000000000
--- a/src/lib/container/iterable.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The iterable package provides several traversal and searching methods.
-// It can be used on anything that satisfies the Iterable interface,
-// including vector, though certain functions, such as Map, can also be used on
-// something that would produce an infinite amount of data.
-package iterable
-
-import "container/vector"
-
-type Iterable interface {
- // Iter should return a fresh channel each time it is called.
- Iter() <-chan interface {}
-}
-
-func not(f func(interface {}) bool) (func(interface {}) bool) {
- return func(e interface {}) bool { return !f(e) }
-}
-
-// All tests whether f is true for every element of iter.
-func All(iter Iterable, f func(interface {}) bool) bool {
- for e := range iter.Iter() {
- if !f(e) {
- return false
- }
- }
- return true
-}
-
-// Any tests whether f is true for at least one element of iter.
-func Any(iter Iterable, f func(interface {}) bool) bool {
- return !All(iter, not(f))
-}
-
-// Data returns a slice containing the elements of iter.
-func Data(iter Iterable) []interface {} {
- vec := vector.New(0);
- for e := range iter.Iter() {
- vec.Push(e)
- }
- return vec.Data()
-}
-
-// filteredIterable is a struct that implements Iterable with each element
-// passed through a filter.
-type filteredIterable struct {
- it Iterable;
- f func(interface {}) bool;
-}
-
-func (f *filteredIterable) iterate(out chan<- interface {}) {
- for e := range f.it.Iter() {
- if f.f(e) {
- out <- e
- }
- }
- close(out)
-}
-
-func (f *filteredIterable) Iter() <-chan interface {} {
- ch := make(chan interface {});
- go f.iterate(ch);
- return ch;
-}
-
-// Filter returns an Iterable that returns the elements of iter that satisfy f.
-func Filter(iter Iterable, f func(interface {}) bool) Iterable {
- return &filteredIterable{ iter, f }
-}
-
-// Find returns the first element of iter that satisfies f.
-// Returns nil if no such element is found.
-func Find(iter Iterable, f func(interface {}) bool) interface {} {
- for e := range Filter(iter, f).Iter() {
- return e
- }
- return nil
-}
-
-// Injector is a type representing a function that takes two arguments,
-// an accumulated value and an element, and returns the next accumulated value.
-// See the Inject function.
-type Injector func(interface {}, interface {}) interface{};
-
-// Inject combines the elements of iter by repeatedly calling f with an
-// accumulated value and each element in order. The starting accumulated value
-// is initial, and after each call the accumulated value is set to the return
-// value of f. For instance, to compute a sum:
-// var arr IntArray = []int{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
-// sum := iterable.Inject(arr, 0,
-// func(ax interface {}, x interface {}) interface {} {
-// return ax.(int) + x.(int) }).(int)
-func Inject(iter Iterable, initial interface {}, f Injector) interface {} {
- acc := initial;
- for e := range iter.Iter() {
- acc = f(acc, e)
- }
- return acc
-}
-
-// mappedIterable is a helper struct that implements Iterable, returned by Map.
-type mappedIterable struct {
- it Iterable;
- f func(interface {}) interface {};
-}
-
-func (m *mappedIterable) iterate(out chan<- interface {}) {
- for e := range m.it.Iter() {
- out <- m.f(e)
- }
- close(out)
-}
-
-func (m *mappedIterable) Iter() <-chan interface {} {
- ch := make(chan interface {});
- go m.iterate(ch);
- return ch
-}
-
-// Map returns an Iterable that returns the result of applying f to each
-// element of iter.
-func Map(iter Iterable, f func(interface {}) interface {}) Iterable {
- return &mappedIterable{ iter, f }
-}
-
-// Partition(iter, f) returns Filter(iter, f) and Filter(iter, !f).
-func Partition(iter Iterable, f func(interface {}) bool) (Iterable, Iterable) {
- return Filter(iter, f), Filter(iter, not(f))
-}
-
-// TODO:
-// - Zip
diff --git a/src/lib/container/iterable_test.go b/src/lib/container/iterable_test.go
deleted file mode 100644
index ceb1de6e4..000000000
--- a/src/lib/container/iterable_test.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package iterable
-
-import (
- "container/iterable";
- "testing";
-)
-
-type IntArray []int;
-
-func (arr IntArray) Iter() <-chan interface {} {
- ch := make(chan interface {});
- go func() {
- for i, x := range arr {
- ch <- x
- }
- close(ch)
- }();
- return ch
-}
-
-var oneToFive IntArray = []int{ 1, 2, 3, 4, 5 };
-
-func isNegative(n interface {}) bool {
- return n.(int) < 0
-}
-func isPositive(n interface {}) bool {
- return n.(int) > 0
-}
-func isAbove3(n interface {}) bool {
- return n.(int) > 3
-}
-func isEven(n interface {}) bool {
- return n.(int) % 2 == 0
-}
-func doubler(n interface {}) interface {} {
- return n.(int) * 2
-}
-func addOne(n interface {}) interface {} {
- return n.(int) + 1
-}
-func adder(acc interface {}, n interface {}) interface {} {
- return acc.(int) + n.(int)
-}
-
-// A stream of the natural numbers: 0, 1, 2, 3, ...
-type integerStream struct {}
-func (i integerStream) Iter() <-chan interface {} {
- ch := make(chan interface {});
- go func() {
- for i := 0; ; i++ {
- ch <- i
- }
- }();
- return ch
-}
-
-func TestAll(t *testing.T) {
- if !All(oneToFive, isPositive) {
- t.Error("All(oneToFive, isPositive) == false")
- }
- if All(oneToFive, isAbove3) {
- t.Error("All(oneToFive, isAbove3) == true")
- }
-}
-
-func TestAny(t *testing.T) {
- if Any(oneToFive, isNegative) {
- t.Error("Any(oneToFive, isNegative) == true")
- }
- if !Any(oneToFive, isEven) {
- t.Error("Any(oneToFive, isEven) == false")
- }
-}
-
-func assertArraysAreEqual(t *testing.T, res []interface {}, expected []int) {
- if len(res) != len(expected) {
- t.Errorf("len(res) = %v, want %v", len(res), len(expected));
- goto missing
- }
- for i := range res {
- if v := res[i].(int); v != expected[i] {
- t.Errorf("res[%v] = %v, want %v", i, v, expected[i]);
- goto missing
- }
- }
- return;
-missing:
- t.Errorf("res = %v\nwant %v", res, expected);
-}
-
-func TestFilter(t *testing.T) {
- ints := integerStream{};
- moreInts := Filter(ints, isAbove3).Iter();
- res := make([]interface {}, 3);
- for i := 0; i < 3; i++ {
- res[i] = <-moreInts;
- }
- assertArraysAreEqual(t, res, []int{ 4, 5, 6 })
-}
-
-func TestFind(t *testing.T) {
- ints := integerStream{};
- first := Find(ints, isAbove3);
- if first.(int) != 4 {
- t.Errorf("Find(ints, isAbove3) = %v, want 4", first)
- }
-}
-
-func TestInject(t *testing.T) {
- res := Inject(oneToFive, 0, adder);
- if res.(int) != 15 {
- t.Errorf("Inject(oneToFive, 0, adder) = %v, want 15", res)
- }
-}
-
-func TestMap(t *testing.T) {
- res := Data(Map(Map(oneToFive, doubler), addOne));
- assertArraysAreEqual(t, res, []int{ 3, 5, 7, 9, 11 })
-}
-
-func TestPartition(t *testing.T) {
- ti, fi := Partition(oneToFive, isEven);
- assertArraysAreEqual(t, Data(ti), []int{ 2, 4 });
- assertArraysAreEqual(t, Data(fi), []int{ 1, 3, 5 })
-}