Skip to content

Commit fc11cca

Browse files
committed
Implement contains for Lists, Vectors and Sets, to match clojure's contains?
1 parent c53365d commit fc11cca

2 files changed

Lines changed: 42 additions & 12 deletions

File tree

src/edn.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -129,20 +129,24 @@ impl Edn<'_> {
129129
}
130130

131131
pub fn contains(&self, e: &Self) -> bool {
132-
if let Edn::Map(m) = self {
133-
return m.contains_key(e);
134-
} else if let Edn::Tagged(tag, m) = self {
135-
if let Edn::Key(key) = e {
136-
let Some(tag) = get_tag(tag, key) else { return false };
137-
let key = check_key(tag, key);
132+
match self {
133+
Edn::Map(m) => m.contains_key(e),
134+
Edn::Tagged(tag, m) => {
135+
if let Edn::Key(key) = e {
136+
let Some(tag) = get_tag(tag, key) else { return false };
137+
let key = check_key(tag, key);
138138

139-
return m.contains(&Edn::Key(key));
140-
}
139+
return m.contains(&Edn::Key(key));
140+
}
141141

142-
// Cover cases where it's not a keyword
143-
return m.contains(e);
142+
// Cover cases where it's not a keyword
143+
m.contains(e)
144+
}
145+
Edn::Vector(v) => v.contains(e),
146+
Edn::Set(s) => s.contains(e),
147+
Edn::List(l) => l.contains(e),
148+
_ => false,
144149
}
145-
false
146150
}
147151
}
148152

tests/read.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,33 @@ fn namespace_syntax_edge_cases() {
301301
let edn_data = edn::read_string(r#"#thingy {:f#猫o "bar" :baz/bar "qux" 42 24}"#).unwrap();
302302
assert_eq!(edn_data.get(&Edn::Key("thingy/f#猫o")), None);
303303
assert_eq!(edn_data.get(&Edn::Key("baz/bar")), None);
304+
}
305+
306+
#[test]
307+
fn get_contains() {
308+
let edn_data = edn::read_string(r#"{:f#猫o "bar" :baz/bar "qux" 42 24}"#).unwrap();
309+
assert_eq!(edn_data.get(&Edn::Key("f#猫o")), Some(&Edn::Str("bar")));
310+
assert_eq!(edn_data.contains(&Edn::Key("f#猫o")), true);
311+
assert_eq!(edn_data.get(&Edn::Key("foo")), None);
312+
assert_eq!(edn_data.contains(&Edn::Key("foo")), false);
313+
314+
let edn_data = edn::read_string(r#"#{:f#猫o "bar" :baz/bar "qux" 42 24}"#).unwrap();
315+
assert_eq!(edn_data.contains(&Edn::Key("f#猫o")), true);
316+
assert_eq!(edn_data.contains(&Edn::Int(42)), true);
317+
assert_eq!(edn_data.contains(&Edn::Key("foo")), false);
304318

305319
let edn_data = edn::read_string(r#"[:f#猫o "bar" :baz/bar "qux" 42 24]"#).unwrap();
306-
assert_eq!(edn_data.contains(&Edn::Key("baz/bar")), false);
320+
assert_eq!(edn_data.contains(&Edn::Key("f#猫o")), true);
321+
assert_eq!(edn_data.contains(&Edn::Int(42)), true);
322+
assert_eq!(edn_data.contains(&Edn::Key("foo")), false);
323+
324+
let edn_data = edn::read_string(r#"(:f#猫o "bar" :baz/bar "qux" 42 24)"#).unwrap();
325+
assert_eq!(edn_data.contains(&Edn::Key("f#猫o")), true);
326+
assert_eq!(edn_data.contains(&Edn::Int(42)), true);
327+
assert_eq!(edn_data.contains(&Edn::Key("foo")), false);
328+
329+
let edn_data = edn::read_string(r#"42"#).unwrap();
330+
assert_eq!(edn_data.contains(&Edn::Key("f#猫o")), false);
331+
assert_eq!(edn_data.contains(&Edn::Int(42)), false);
332+
assert_eq!(edn_data.contains(&Edn::Key("foo")), false);
307333
}

0 commit comments

Comments
 (0)