Skip to content

Commit c70e35a

Browse files
committed
wip work for join
1 parent 873406a commit c70e35a

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

src/clojure_string.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
pub (crate) mod reverse;
2+
pub (crate) mod join;

src/clojure_string/join.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use crate::ifn::IFn;
2+
use crate::value::{ToValue, Value};
3+
use std::rc::Rc;
4+
5+
use crate::error_message;
6+
use crate::type_tag::TypeTag;
7+
8+
/// clojure.string/reverse ; reverses a string
9+
/// (defn print-string [string] .. prints single string .. )
10+
#[derive(Debug, Clone)]
11+
pub struct JoinFn {}
12+
impl ToValue for JoinFn {
13+
fn to_value(&self) -> Value {
14+
Value::IFn(Rc::new(self.clone()))
15+
}
16+
}
17+
impl IFn for JoinFn {
18+
fn invoke(&self, args: Vec<Rc<Value>>) -> Value {
19+
if args.len() == 1 {
20+
match args.get(0).unwrap().to_value() {
21+
Value::Iseq(s) => Value::String(s.chars().rev().collect()),
22+
_a => error_message::type_mismatch(TypeTag::String, &_a.to_value())
23+
}
24+
25+
} else {
26+
return error_message::wrong_arg_count(2, args.len());
27+
28+
}
29+
}
30+
}
31+
32+
#[cfg(test)]
33+
mod tests {
34+
mod reverse_tests {
35+
use crate::value::Value;
36+
use std::rc::Rc;
37+
use crate::clojure_string::reverse::JoinFn;
38+
use crate::ifn::IFn;
39+
40+
#[test]
41+
fn reverse_string() {
42+
let reverse = JoinFn {};
43+
let s = "hello";
44+
let args = vec![Rc::new(Value::String(String::from(s)))];
45+
assert_eq!(Value::String(String::from("olleh")), reverse.invoke(args));
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)