diff options
| author | Jesse Ruderman <jruderman@gmail.com> | 2011-09-24 16:33:26 -0700 |
|---|---|---|
| committer | Jesse Ruderman <jruderman@gmail.com> | 2011-09-24 16:33:26 -0700 |
| commit | 3b5b29c7ec2c28c53bf480a77472f39d939cc72b (patch) | |
| tree | 5f33015a8594e11ddbb216de0ead7ef81076d3fd /src/comp/syntax | |
| parent | 0125532106bceab9dcf7ffd81e8a351c587f53c4 (diff) | |
Reduce and clarify abuse of 'pure' in interner
Diffstat (limited to 'src/comp/syntax')
| -rw-r--r-- | src/comp/syntax/util/interner.rs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/comp/syntax/util/interner.rs b/src/comp/syntax/util/interner.rs index 164b38fe870..67324491267 100644 --- a/src/comp/syntax/util/interner.rs +++ b/src/comp/syntax/util/interner.rs @@ -28,7 +28,13 @@ fn intern<@T>(itr: interner<T>, val: T) -> uint { } } -pure fn get<@T>(itr: interner<T>, idx: uint) -> T { ret itr.vect[idx]; } - -pure fn len<T>(itr: interner<T>) -> uint { ret vec::len(itr.vect); } +// |get| isn't "pure" in the traditional sense, because it can go from +// failing to returning a value as items are interned. But for typestate, +// where we first check a pred and then rely on it, ceasing to fail is ok. +pure fn get<@T>(itr: interner<T>, idx: uint) -> T { + unchecked { + itr.vect[idx] + } +} +fn len<T>(itr: interner<T>) -> uint { ret vec::len(itr.vect); } |
