diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2011-04-06 17:56:44 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2011-04-06 17:58:18 -0700 |
| commit | 2e90bd94de32c739733966bfac96cf35e9a08655 (patch) | |
| tree | 01cecc3fbc92d27e01177b5d3cb0785239877ea9 /src/lib/_vec.rs | |
| parent | 36d75d6391873b34a1f4e10c34d3d58c54a453c5 (diff) | |
| download | rust-2e90bd94de32c739733966bfac96cf35e9a08655.tar.gz rust-2e90bd94de32c739733966bfac96cf35e9a08655.zip | |
Continued sketching out code for checking states against preconditions.
It's still sketchy. I added a typestate annotation field to statements tagged stmt_decl or stmt_expr, because a stmt_decl statement has a typestate that's different from that of its child node. This necessitated trivial changes to a bunch of other files all over to the compiler. I also added a few small standard library functions, some of which I didn't actually end up using but which I thought might be useful anyway.
Diffstat (limited to 'src/lib/_vec.rs')
| -rw-r--r-- | src/lib/_vec.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs index f2b169efb2c..916a8205f23 100644 --- a/src/lib/_vec.rs +++ b/src/lib/_vec.rs @@ -1,5 +1,6 @@ import option.none; import option.some; +import util.orb; type vbuf = rustrt.vbuf; @@ -230,6 +231,26 @@ fn foldl[T, U](fn (&U, &T) -> U p, &U z, &vec[T] v) -> U { } } +fn unzip[T, U](&vec[tup(T, U)] v) -> tup(vec[T], vec[U]) { + auto sz = len[tup(T, U)](v); + + if (sz == 0u) { + ret tup(alloc[T](0u), alloc[U](0u)); + } + else { + auto rest = slice[tup(T, U)](v, 1u, sz); + auto tl = unzip[T, U](rest); + auto a = vec(v.(0)._0); + auto b = vec(v.(0)._1); + ret tup(a + tl._0, b + tl._1); + } +} + +fn or(&vec[bool] v) -> bool { + auto f = orb; + be _vec.foldl[bool, bool](f, false, v); +} + // Local Variables: // mode: rust; // fill-column: 78; |
