1
- use std:: sync:: Arc ;
1
+ use std:: { cell :: RefCell , sync:: Arc } ;
2
2
3
3
use cirru_edn:: { Edn , EdnAnyRef , EdnListView } ;
4
4
use regex:: Regex ;
@@ -14,7 +14,7 @@ pub fn re_pattern(args: Vec<Edn>) -> Result<Edn, String> {
14
14
match & args[ 0 ] {
15
15
Edn :: Str ( s) => match Regex :: new ( s) {
16
16
Ok ( pattern) => {
17
- let p = Arc :: from ( pattern) ;
17
+ let p = Arc :: from ( RefCell :: new ( pattern) ) ;
18
18
let p2 = p. to_owned ( ) ;
19
19
std:: mem:: forget ( p) ;
20
20
Ok ( Edn :: AnyRef ( EdnAnyRef ( p2) ) )
@@ -37,7 +37,7 @@ pub fn re_matches(args: Vec<Edn>) -> Result<Edn, String> {
37
37
Err ( e) => Err ( format ! ( "re-matches failed, {}" , e) ) ,
38
38
} ,
39
39
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
40
- if let Some ( pattern) = p. downcast_ref :: < Regex > ( ) {
40
+ if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
41
41
Ok ( Edn :: Bool ( pattern. is_match ( s) ) )
42
42
} else {
43
43
Err ( format ! ( "re-matches expected a regex, got {:?}" , p) )
@@ -64,7 +64,7 @@ pub fn re_find_index(args: Vec<Edn>) -> Result<Edn, String> {
64
64
}
65
65
}
66
66
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
67
- if let Some ( pattern) = p. downcast_ref :: < Regex > ( ) {
67
+ if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
68
68
match pattern. find ( s) {
69
69
Some ( matched) => Ok ( Edn :: Number ( matched. start ( ) as f64 ) ) ,
70
70
None => Ok ( Edn :: Number ( -1.0 ) ) , // TODO maybe nil
@@ -98,7 +98,7 @@ pub fn re_find(args: Vec<Edn>) -> Result<Edn, String> {
98
98
}
99
99
}
100
100
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
101
- if let Some ( pattern) = p. downcast_ref :: < Regex > ( ) {
101
+ if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
102
102
let mut matched = pattern. find_iter ( s) ;
103
103
match matched. next ( ) {
104
104
Some ( v) => Ok ( Edn :: str ( v. as_str ( ) . to_string ( ) ) ) ,
@@ -130,7 +130,7 @@ pub fn re_find_all(args: Vec<Edn>) -> Result<Edn, String> {
130
130
Err ( e) => Err ( format ! ( "re-find-all failed, {}" , e) ) ,
131
131
} ,
132
132
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
133
- if let Some ( pattern) = p. downcast_ref :: < Regex > ( ) {
133
+ if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
134
134
let mut ys: Vec < Edn > = vec ! [ ] ;
135
135
for v in pattern. find_iter ( s) {
136
136
ys. push ( Edn :: Str ( v. as_str ( ) . to_string ( ) . into ( ) ) )
@@ -162,7 +162,7 @@ pub fn re_split(args: Vec<Edn>) -> Result<Edn, String> {
162
162
Err ( e) => Err ( format ! ( "re-split failed, {}" , e) ) ,
163
163
} ,
164
164
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) ) => {
165
- if let Some ( pattern) = p. downcast_ref :: < Regex > ( ) {
165
+ if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
166
166
let mut ys: Vec < Edn > = vec ! [ ] ;
167
167
for piece in pattern. split ( s) {
168
168
ys. push ( Edn :: str ( piece) ) ;
@@ -188,7 +188,7 @@ pub fn re_replace_all(args: Vec<Edn>) -> Result<Edn, String> {
188
188
Err ( e) => Err ( format ! ( "re-replace-all failed, {}" , e) ) ,
189
189
} ,
190
190
( Edn :: Str ( s) , Edn :: AnyRef ( EdnAnyRef ( p) ) , Edn :: Str ( next) ) => {
191
- if let Some ( pattern) = p. downcast_ref :: < Regex > ( ) {
191
+ if let Some ( pattern) = p. borrow ( ) . downcast_ref :: < Regex > ( ) {
192
192
Ok ( Edn :: str ( pattern. replace_all ( s, & * * next) . into_owned ( ) ) )
193
193
} else {
194
194
Err ( format ! ( "re-replace-all expected a regex, got {:?}" , p) )
0 commit comments