From 2a046655f47889e2ef752166963876d37f726044 Mon Sep 17 00:00:00 2001 From: humphreylee <66808535+humphreylee@users.noreply.github.com> Date: Wed, 31 Jul 2024 20:18:46 +0800 Subject: [PATCH] Update dataframe.rs --- charming/src/datatype/dataframe.rs | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/charming/src/datatype/dataframe.rs b/charming/src/datatype/dataframe.rs index bd87fd7..1bc45d6 100644 --- a/charming/src/datatype/dataframe.rs +++ b/charming/src/datatype/dataframe.rs @@ -109,3 +109,39 @@ macro_rules! vec_len { }; } +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, Ident, LitStr}; + +#[proc_macro] +pub fn transpose(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as syn::ExprTuple); + + let vectors: Vec<_> = input.elems.iter().map(|expr| { + match expr { + syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Str(s), .. }) => { + let ident = Ident::new(&s.value(), s.span()); + quote! { #ident } + } + _ => panic!("Expected vector identifiers"), + } + }).collect(); + + let len = vectors.len(); + let first_vec = &vectors[0]; + + let expanded = quote! { + { + let mut result = Vec::with_capacity(#len); + for i in 0..#first_vec.len() { + result.push(vec![ + #((#vectors[j])[i]),* + ]); + } + result + } + }; + + expanded.into() +} +