Skip to content

Commit ae3d238

Browse files
committed
Slight cleanup to string join
1 parent 1de6ea7 commit ae3d238

File tree

1 file changed

+28
-52
lines changed

1 file changed

+28
-52
lines changed

src/clojure_string/join.rs

Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1+
use crate::iterable::Iterable;
12
use crate::ifn::IFn;
23
use crate::value::{ToValue, Value};
34
use std::rc::Rc;
45

56
use crate::error_message;
6-
use crate::persistent_list::PersistentList::Cons;
7-
use crate::persistent_list::ToPersistentListIter;
8-
use crate::persistent_vector::ToPersistentVectorIter;
9-
use crate::type_tag::TypeTag;
10-
use itertools::Itertools;
7+
use crate::protocol::ProtocolCastable;
118

129
/// clojure.string/join ; joins a coll of items together as a string
1310
/// (join
@@ -22,55 +19,34 @@ impl ToValue for JoinFn {
2219
}
2320
impl IFn for JoinFn {
2421
fn invoke(&self, args: Vec<Rc<Value>>) -> Value {
25-
if args.len() == 1 || args.len() == 2 {
26-
let separator = if args.len() == 2 {
27-
args.get(0).unwrap().to_string()
28-
} else {
29-
String::from("")
30-
};
31-
let coll = if args.len() == 1 {
32-
args.get(0)
33-
} else {
34-
args.get(1)
35-
};
36-
match coll.unwrap().to_value() {
37-
Value::PersistentList(Cons(head, tail, count)) => {
38-
return if count == 0 {
39-
Value::String(String::from(""))
40-
} else if count == 1 {
41-
Value::String(head.to_string())
42-
} else {
43-
Value::String(
44-
String::from(head.to_string())
45-
+ separator.as_str()
46-
+ tail
47-
.iter()
48-
.map(|x| x.to_string())
49-
.collect::<Vec<std::string::String>>()
50-
.join(&separator)
51-
.as_str(),
52-
)
53-
}
54-
}
55-
Value::PersistentVector(pvec) => {
56-
return if pvec.vals.len() == 0 {
57-
Value::String(String::from(""))
58-
} else {
59-
Value::String(String::from(
60-
pvec.vals
61-
.iter()
62-
.map(|x| x.to_string())
63-
.collect::<Vec<std::string::String>>()
64-
.join(&separator)
65-
.as_str(),
66-
))
67-
}
68-
}
69-
_ => Value::String(String::from("")),
70-
}
71-
} else {
22+
if args.len() != 1 && args.len() != 2 {
7223
return error_message::wrong_varg_count(&[1, 2], args.len());
7324
}
25+
26+
let separator = if args.len() == 1 {
27+
String::from("")
28+
} else {
29+
args.get(0).unwrap().to_string()
30+
};
31+
32+
let coll = if args.len() == 1 {
33+
args.get(0)
34+
} else {
35+
args.get(1)
36+
};
37+
if let Some(iterable) = coll.unwrap().try_as_protocol::<Iterable>() {
38+
Value::String(
39+
iterable
40+
.iter()
41+
.map(|x| x.to_string())
42+
.collect::<Vec<std::string::String>>()
43+
.join(&separator)
44+
)
45+
}
46+
else {
47+
Value::String(String::from(""))
48+
}
49+
7450
}
7551
}
7652

0 commit comments

Comments
 (0)