Skip to content

fix to #1315 + small additions to std::either and result #1317

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Dec 16, 2011
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/libcore/bool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ Returns:

An u8 whose first bit is set if `if_true(v)` holds
*/
fn to_bit(v: t) -> u8 { if v { 1u8 } else { 0u8 } }
pure fn to_bit(v: t) -> u8 { if v { 1u8 } else { 0u8 } }

// Local Variables:
// mode: rust;
Expand Down
2 changes: 1 addition & 1 deletion src/libcore/box.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Function: ptr_eq

Determine if two shared boxes point to the same object
*/
fn ptr_eq<T>(a: @T, b: @T) -> bool {
pure fn ptr_eq<T>(a: @T, b: @T) -> bool {
// FIXME: ptr::addr_of
unsafe {
let a_ptr: uint = unsafe::reinterpret_cast(a);
Expand Down
4 changes: 2 additions & 2 deletions src/libcore/char.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ pure fn to_digit(c: char) -> u8 unsafe {
Convert a char to the corresponding digit. Returns none when the
character is not a valid hexadecimal digit.
*/
fn maybe_digit(c: char) -> option::t<u8> {
pure fn maybe_digit(c: char) -> option::t<u8> {
alt c {
'0' to '9' { option::some(c as u8 - ('0' as u8)) }
'a' to 'z' { option::some(c as u8 + 10u8 - ('a' as u8)) }
Expand All @@ -143,7 +143,7 @@ fn maybe_digit(c: char) -> option::t<u8> {
Returns:
-1 if a<b, 0 if a==b, +1 if a>b
*/
fn cmp(a: char, b: char) -> int {
pure fn cmp(a: char, b: char) -> int {
ret if b > a { -1 }
else if b < a { 1 }
else { 0 }
Expand Down
25 changes: 25 additions & 0 deletions src/libcore/either.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,31 @@ fn partition<copy T, copy U>(eithers: [t<T, U>])
ret {lefts: lefts, rights: rights};
}

/*
Function: flip

Flips between left and right of a given either
*/
pure fn flip<copy T, copy U>(eith: t<T, U>) -> t<U, T> {
alt eith {
right(r) { left(r) }
left(l) { right(l) }
}
}

/*
Function: to_result

Converts either::t to a result::t, making the "right" choice
an ok result, and the "left" choice a fail
*/
pure fn to_result<copy T, copy U>(eith: t<T, U>) -> result::t<U, T> {
alt eith {
right(r) { result::ok(r) }
left(l) { result::err(l) }
}
}

//
// Local Variables:
// mode: rust
Expand Down
4 changes: 2 additions & 2 deletions src/libcore/option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Failure:

Fails if the value equals `none`.
*/
fn get<copy T>(opt: t<T>) -> T {
pure fn get<copy T>(opt: t<T>) -> T {
alt opt { some(x) { ret x; } none. { fail "option none"; } }
}

Expand Down Expand Up @@ -61,7 +61,7 @@ Function: from_maybe

Returns the contained value or a default
*/
fn from_maybe<T>(def: T, opt: t<T>) -> T {
pure fn from_maybe<T>(def: T, opt: t<T>) -> T {
alt opt { some(x) { x } none. { def } }
}

Expand Down
13 changes: 10 additions & 3 deletions src/libcore/result.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ fn get<T, U>(res: t<T, U>) -> T {
ok(t) { t }
err(_) {
// FIXME: Serialize the error value
// and include it in the fail message
// and include it in the fail message (maybe just note it)
fail "get called on error result";
}
}
Expand Down Expand Up @@ -71,7 +71,7 @@ Function: success

Returns true if the result is <ok>
*/
fn success<T, U>(res: t<T, U>) -> bool {
pure fn success<T, U>(res: t<T, U>) -> bool {
alt res {
ok(_) { true }
err(_) { false }
Expand All @@ -83,10 +83,17 @@ Function: failure

Returns true if the result is <error>
*/
fn failure<T, U>(res: t<T, U>) -> bool {
pure fn failure<T, U>(res: t<T, U>) -> bool {
!success(res)
}

pure fn to_either<copy T, copy U>(res: t<U, T>) -> either::t<T, U> {
alt res {
ok(res) { either::right(res) }
err(fail_) { either::left(fail_) }
}
}

/*
Function: chain

Expand Down
8 changes: 4 additions & 4 deletions src/libcore/str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ Function: eq

Bytewise string equality
*/
fn eq(&&a: str, &&b: str) -> bool { a == b }
pure fn eq(&&a: str, &&b: str) -> bool { a == b }

/*
Function: lteq

Bytewise less than or equal
*/
fn lteq(&&a: str, &&b: str) -> bool { a <= b }
pure fn lteq(&&a: str, &&b: str) -> bool { a <= b }

/*
Function: hash
Expand Down Expand Up @@ -131,7 +131,7 @@ Function: byte_len

Returns the length in bytes of a string
*/
fn byte_len(s: str) -> uint unsafe {
pure fn byte_len(s: str) -> uint unsafe {
let v: [u8] = unsafe::reinterpret_cast(s);
let vlen = vec::len(v);
unsafe::leak(v);
Expand Down Expand Up @@ -261,7 +261,7 @@ Function: utf8_char_width

FIXME: What does this function do?
*/
fn utf8_char_width(b: u8) -> uint {
pure fn utf8_char_width(b: u8) -> uint {
let byte: uint = b as uint;
if byte < 128u { ret 1u; }
if byte < 192u {
Expand Down
2 changes: 1 addition & 1 deletion src/libcore/sys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Function: last_os_error
Get a string representing the platform-dependent last error
*/
fn last_os_error() -> str {
ret rustrt::last_os_error();
rustrt::last_os_error()
}

/*
Expand Down
6 changes: 3 additions & 3 deletions src/libcore/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ Returns the first element of a vector
Predicates:
<is_not_empty> (v)
*/
fn head<copy T>(v: [const T]) : is_not_empty(v) -> T { ret v[0]; }
pure fn head<copy T>(v: [const T]) : is_not_empty(v) -> T { ret v[0]; }

/*
Function: tail
Expand Down Expand Up @@ -221,7 +221,7 @@ Returns:
An option containing the last element of `v` if `v` is not empty, or
none if `v` is empty.
*/
fn last<copy T>(v: [const T]) -> option::t<T> {
pure fn last<copy T>(v: [const T]) -> option::t<T> {
if len(v) == 0u { ret none; }
ret some(v[len(v) - 1u]);
}
Expand All @@ -234,7 +234,7 @@ Returns the last element of a non-empty vector `v`
Predicates:
<is_not_empty> (v)
*/
fn last_total<copy T>(v: [const T]) : is_not_empty(v) -> T {
pure fn last_total<copy T>(v: [const T]) : is_not_empty(v) -> T {
ret v[len(v) - 1u];
}

Expand Down
2 changes: 1 addition & 1 deletion src/libstd/bitv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ Function: get

Retreive the value at index `i`
*/
fn get(v: t, i: uint) -> bool {
pure fn get(v: t, i: uint) -> bool {
assert (i < v.nbits);
let bits = uint_bits;
let w = i / bits;
Expand Down
6 changes: 3 additions & 3 deletions src/libstd/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ Function: tail

Returns all but the first element of a list
*/
fn tail<copy T>(ls: list<T>) -> list<T> {
pure fn tail<copy T>(ls: list<T>) -> list<T> {
alt ls { cons(_, tl) { ret *tl; } nil. { fail "list empty" } }
}

Expand All @@ -121,7 +121,7 @@ Function: head

Returns the first element of a list
*/
fn head<copy T>(ls: list<T>) -> T {
pure fn head<copy T>(ls: list<T>) -> T {
alt ls { cons(hd, _) { ret hd; } nil. { fail "list empty" } }
}

Expand All @@ -130,7 +130,7 @@ Function: append

Appends one list to another
*/
fn append<copy T>(l: list<T>, m: list<T>) -> list<T> {
pure fn append<copy T>(l: list<T>, m: list<T>) -> list<T> {
alt l {
nil. { ret m; }
cons(x, xs) { let rest = append(*xs, m); ret cons(x, @rest); }
Expand Down
1 change: 1 addition & 0 deletions src/libstd/posix_fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ fn list_dir(path: str) -> [str] {

}

// FIXME make pure when str::char_at is
fn path_is_absolute(p: str) -> bool { ret str::char_at(p, 0u) == '/'; }

const path_sep: char = '/';
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/rope.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ Returns:

A negative value if `left < right`, 0 if eq(left, right) or a positive
value if `left > right`
*/
*/
fn cmp(left: rope, right: rope) -> int {
alt((left, right)) {
(node::empty., node::empty.) { ret 0; }
Expand Down
6 changes: 3 additions & 3 deletions src/libstd/unicode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,16 +151,16 @@ mod icu {
#[link_name = "icuuc"]
#[abi = "cdecl"]
native mod libicu {
fn u_hasBinaryProperty(c: UChar32, which: UProperty) -> UBool;
pure fn u_hasBinaryProperty(c: UChar32, which: UProperty) -> UBool;
}
}

fn is_XID_start(c: char) -> bool {
pure fn is_XID_start(c: char) -> bool {
ret icu::libicu::u_hasBinaryProperty(c, icu::UCHAR_XID_START)
== icu::TRUE;
}

fn is_XID_continue(c: char) -> bool {
pure fn is_XID_continue(c: char) -> bool {
ret icu::libicu::u_hasBinaryProperty(c, icu::UCHAR_XID_START)
== icu::TRUE;
}