mirror of
https://github.com/swc-project/swc.git
synced 2024-12-25 22:56:11 +03:00
222bdc191f
`Map<T>` adds a method named `map` which is actually `Box<T>` -> `Box<T>` without reallocation. swc_ecma_transforms: - chain_at!(Type, passes) This macro deeply joins path at 'Type' level.
67 lines
1.4 KiB
Rust
67 lines
1.4 KiB
Rust
#![feature(box_patterns)]
|
|
#![feature(box_syntax)]
|
|
#![feature(specialization)]
|
|
#![feature(test)]
|
|
|
|
#[macro_use]
|
|
extern crate swc_common;
|
|
extern crate test;
|
|
|
|
use std::{cell::RefCell, rc::Rc};
|
|
use swc_common::{Fold, FoldWith};
|
|
|
|
struct Named(&'static str, Rc<RefCell<Vec<(&'static str, String)>>>);
|
|
impl Fold<String> for Named {
|
|
fn fold(&mut self, v: String) -> String {
|
|
let name = self.0;
|
|
self.1.borrow_mut().push((name, v.clone()));
|
|
|
|
v
|
|
}
|
|
}
|
|
|
|
#[derive(Fold)]
|
|
struct Nested<T>(#[fold(bound)] T);
|
|
|
|
#[test]
|
|
fn vec_order() {
|
|
let logger = Rc::new(RefCell::default());
|
|
|
|
vec![
|
|
box String::from("foo"),
|
|
box String::from("bar"),
|
|
box String::from("baz"),
|
|
]
|
|
.into_iter()
|
|
.map(Box::new)
|
|
.map(Nested)
|
|
.map(Box::new)
|
|
.map(Nested)
|
|
.map(Nested)
|
|
.collect::<Vec<_>>()
|
|
.fold_with(&mut chain!(
|
|
Named("A", logger.clone()),
|
|
Named("B", logger.clone()),
|
|
Named("C", logger.clone())
|
|
));
|
|
|
|
let result = Rc::try_unwrap(logger).unwrap();
|
|
assert_eq!(
|
|
vec![
|
|
("A", "foo"),
|
|
("B", "foo"),
|
|
("C", "foo"),
|
|
("A", "bar"),
|
|
("B", "bar"),
|
|
("C", "bar"),
|
|
("A", "baz"),
|
|
("B", "baz"),
|
|
("C", "baz"),
|
|
]
|
|
.into_iter()
|
|
.map(|(n, v)| (n, String::from(v)))
|
|
.collect::<Vec<_>>(),
|
|
result.into_inner()
|
|
);
|
|
}
|