A keyword is a symbol, optionally with a namespace, that prints with a leading colon.
This concept is imported from Clojure, as it features in EDN and the query
syntax that we use.
Clojure's constraints are looser than ours, allowing empty namespaces or
names:
user=> (keyword "" "")
:/
user=> (keyword "foo" "")
:foo/
user=> (keyword "" "bar")
:/bar
We think that's nonsense, so we only allow keywords like :bar
and :foo/bar
,
with both namespace and main parts containing no whitespace and no colon or slash:
let bar = Keyword::plain("bar");
let foo_bar = Keyword::namespaced("foo", "bar");
assert_eq!("bar", bar.name());
assert_eq!(None, bar.namespace());
assert_eq!("bar", foo_bar.name());
assert_eq!(Some("foo"), foo_bar.namespace());
If you're not sure whether your input is well-formed, you should use a
parser or a reader function first to validate. TODO: implement read
.
Callers are expected to follow these rules:
http://www.clojure.org/reference/reader#_symbols
Future: fast equality (interning?) for keywords.
Creates a new Keyword
.
let keyword = Keyword::namespaced("foo", "bar");
assert_eq!(keyword.to_string(), ":foo/bar");
See also the kw!
macro in the main mentat
crate.
Whether this Keyword
should be interpreted in reverse order. For example,
the two following snippets are identical:
[?y :person/friend ?x]
[?x :person/hired ?y]
[?y :person/friend ?x]
[?y :person/_hired ?x]
assert!(!Keyword::namespaced("foo", "bar").is_backward());
assert!(Keyword::namespaced("foo", "_bar").is_backward());
Whether this Keyword
should be interpreted in forward order.
See symbols::Keyword::is_backward
.
assert!(Keyword::namespaced("foo", "bar").is_forward());
assert!(!Keyword::namespaced("foo", "_bar").is_forward());
Returns a Keyword
with the same namespace and a
'backward' name. See symbols::Keyword::is_backward
.
Returns a forward name if passed a reversed keyword; i.e., this
function is its own inverse.
let nsk = Keyword::namespaced("foo", "bar");
assert!(!nsk.is_backward());
assert_eq!(":foo/bar", nsk.to_string());
let reversed = nsk.to_reversed();
assert!(reversed.is_backward());
assert_eq!(":foo/_bar", reversed.to_string());
If this Keyword
is 'backward' (see symbols::Keyword::is_backward
),
return Some('forward name')
; otherwise, return None
.
let nsk = Keyword::namespaced("foo", "bar");
assert_eq!(None, nsk.unreversed());
let reversed = nsk.to_reversed();
assert_eq!(Some(nsk), reversed.unreversed());
Performs copy-assignment from source
. Read more
Formats the value using the given formatter. Read more
Feeds this value into the given [Hasher
]. Read more
Feeds a slice of this type into the given [Hasher
]. Read more
This method returns an Ordering
between self
and other
. Read more
fn max(self, other: Self) -> Self | 1.21.0 [src] |
Compares and returns the maximum of two values. Read more
fn min(self, other: Self) -> Self | 1.21.0 [src] |
Compares and returns the minimum of two values. Read more
This method returns an ordering between self
and other
values if one exists. Read more
This method tests less than (for self
and other
) and is used by the <
operator. Read more
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
This method tests greater than or equal to (for self
and other
) and is used by the >=
operator. Read more
This method tests for self
and other
values to be equal, and is used by ==
. Read more
This method tests for !=
.
Print the keyword in EDN format.
assert_eq!(":baz", Keyword::plain("baz").to_string());
assert_eq!(":bar/baz", Keyword::namespaced("bar", "baz").to_string());
assert_eq!(":bar/_baz", Keyword::namespaced("bar", "baz").to_reversed().to_string());
assert_eq!(":bar/baz", Keyword::namespaced("bar", "baz").to_reversed().to_reversed().to_string());