11use crate :: keyword:: Keyword ;
22use crate :: maps:: MapEntry ;
3- use crate :: persistent_list:: PersistentListIter ;
4- use crate :: persistent_list:: ToPersistentListIter ;
5- use crate :: persistent_list_map:: ToPersistentListMapIter ;
6- use crate :: persistent_list_map:: { PersistentListMap , PersistentListMapIter } ;
7- use crate :: persistent_vector:: PersistentVectorIter ;
8- use crate :: persistent_vector:: ToPersistentVector ;
9- use crate :: persistent_vector:: ToPersistentVectorIter ;
10- use crate :: protocol:: Protocol ;
3+ use crate :: persistent_list_map:: { PersistentListMap } ;
114use crate :: define_protocol;
5+ use crate :: traits;
126use crate :: symbol:: Symbol ;
137use crate :: value:: ToValue ;
148use crate :: value:: Value ;
@@ -17,54 +11,32 @@ use std::rc::Rc;
1711define_protocol ! (
1812 IMeta = PersistentList |
1913 PersistentVector |
20- PersistentList |
2114 PersistentListMap |
22- Symbol |
23- IFn
15+ Symbol // |
16+ // IFn
2417) ;
25-
26- /// Syntactic sugar, DRY
27- /// map_entry!("doc", "this is a docstring");
28- #[ macro_export]
29- macro_rules! map_entry {
30- ( $key: expr, $value: expr) => { {
31- MapEntry {
32- key: Keyword :: intern( $key) . to_rc_value( ) ,
33- val: $value. to_rc_value( ) ,
34- }
35- } } ;
36- }
37-
38- /// Syntactic sugar, DRY
39- /// persistent_list_map!(map_entry!("key1", "value1"), map_entry!("key2", "value2"));
40- #[ macro_export]
41- macro_rules! persistent_list_map { }
42- ( $( $kv: expr) , * ) => {
43- {
44- let mut temp_vec = Vec :: new ( ) ;
45- $(
46- temp_vec. push ( $kv) ;
47- ) *
48- temp_vec. into_iter ( ) . collect :: < PersistentListMap > ( )
49- }
50- } ;
51- }
52-
53- /// Syntactic sugar, DRY
54- /// merge ! ( base_meta( name, ns) , map_entry!( "key1" , "value1" ) , map_entry!( "key2" , "value2" ) ) ;
55- #[ macro_export]
56- macro_rules! merge {
57- ( $plistmap: expr, $( $kv: expr) , * ) => {
58- {
59- let mut temp_plistmap_as_vec = $plistmap. clone( ) . iter( ) . collect:: <Vec <MapEntry >>( ) ;
60- $(
61- temp_plistmap_as_vec. push( $kv) ;
62- ) *
63- temp_plistmap_as_vec. into_iter( ) . collect:: <PersistentListMap >( )
18+ impl traits:: IMeta for IMeta {
19+ fn meta ( & self ) -> PersistentListMap {
20+ match & * self . value {
21+ Value :: PersistentList ( val) => {
22+ val. meta ( )
23+ }
24+ Value :: PersistentVector ( val) => {
25+ val. meta ( )
26+ }
27+ Value :: PersistentListMap ( val) => {
28+ val. meta ( )
29+ }
30+ Value :: Symbol ( val) => {
31+ val. meta ( )
32+ }
33+ _ => panic ! ( "protocols::IMeta was wrapping an invalid type {} when calling meta()" , self . value. type_tag( ) )
34+ // Value::IFn(val) => {
35+ // val.with_meta(meta)
36+ // }
6437 }
65- } ;
38+ }
6639}
67-
6840/// Constructs base meta if none provided
6941/// {:line 1
7042/// :column 1
@@ -81,3 +53,6 @@ pub fn base_meta(ns: &str, name: &str) -> PersistentListMap {
8153 map_entry!( "name" , Symbol :: intern( name) )
8254 )
8355}
56+
57+ mod tests {
58+ }
0 commit comments