fungi-lang 0.1.63

Fungi: A typed, functional language for programs that name their cached dependency graphs
Documentation
// #![recursion_limit="128"]
// #[macro_use]
// extern crate fungi_lang;

// #[test]
// pub fn trie () {
//   use std::thread;
//   let child =
//     thread::Builder::new().stack_size(64 * 1024 * 1024).spawn(move || { 
//       trie2()
//     });
//   let _ = child.unwrap().join();
// }
// pub fn trie2() {
//     use std::rc::Rc;
//     use fungi_lang::ast::*;
//     use fungi_lang::bitype::*;
//     use fungi_lang::vis::*;


//     let bundle : Bundle = fgi_bundle![
//     //let trie_ast = fgi_exp![
//         decls {
//             /// Optional natural numbers:
//             type OpNat = (+ Unit + Nat );
            
//             /// Levels (as numbers), for level trees.
//             type Lev = ( Nat )

//             /// Abstracted vector, represents an array of Nats
//             type NatVec = ( Unit )
                
//             /// Sequences (balanced binary level trees), whose leaves
//             /// are optional vectors of natural numbers:
//             type Seq = (
//                 rec seq. foralli (X,Y):NmSet.
//                     (+ (+ Unit + NatVec)
//                      + (exists (X1,X2,X3)   :NmSet | ((X1%X2%X3)=X:NmSet).
//                         exists (Y1,Y2,Y3,Y4):NmSet | ((Y1%Y2%Y3%Y4)=Y:NmSet).
//                         x Nm[X1] x Lev
//                         x Ref[Y1](seq[X2][Y2])
//                         x Ref[Y3](seq[X3][Y4]))
//                     )
//             );                
                
//             /// Sets (balanced binary hash tries), whose leaves are
//             /// optional natural numbers:
//             type Set = (
//                 rec set. foralli (X,Y):NmSet.
//                     (+ (+ Unit + NatVec)
//                      + (exists (X1,X2,X3)   :NmSet | ((X1%X2%X3)=X:NmSet).
//                         exists (Y1,Y2,Y3,Y4):NmSet | ((Y1%Y2%Y3%Y4)=Y:NmSet).
//                         x Nm[X1]
//                         x Ref[Y1](set[X2][Y2])
//                         x Ref[Y3](set[X3][Y4]))
//                     )
//             );                

//             /// Structural recursion over a binary tree (output names and pointers):
//             idxtm    Bin   = (#x:Nm.         {x,@1} % {x,@2}  );
//             idxtm WS_Bin   = (#x:NmSet.{@!}( (Bin) x         ));

//             /// Same as above but only one side
//             idxtm WS_Bin_1 = ( #x:NmSet.{@!}(x * {@1}))
//             idxtm WS_Bin_2 = ( #x:NmSet.{@!}(x * {@2}))

//             /// Trie_join: Index functions for output names and pointers:
//             idxtm    Join  = (#x:NmSet.    ( (Bin)((Bin)^* x))); // one app minimum
//             idxtm WS_Join  = (#x:NmSet.{@!}( {Join}  x       ));

//             /// Trie_of_seq: Index functions for output names and pointers:
//             idxtm    Trie  = (#x:NmSet.    ( {Join} x        ));
//             idxtm WS_Trie  = (#x:NmSet.{@!}( {Join} x        ));
//         }

//         let join_vecs:( Thk[0] foralli (X,Y):NmSet.
//             0 Nm[X] -> 0 NatVec -> 0 NatVec ->
//             {{WS_Bin} X; 0} F Set[X][{WS_Bin} X]
//         ) = {
//             ret thunk #nm. #v1. #v2.
//             let lr:(Ref[{WS_Bin_1}X] Set[0][0]) = { ref {nm, (@1)} inj1 inj2 v1 }
//             let rr:(Ref[{WS_Bin_2}X] Set[0][0]) = { ref {nm, (@2)} inj1 inj2 v2 }
//             ret inj2 pack (X,0,0,{WS_Bin_1}X,0,{WS_Bin_2}X,0)
//                 (nm,0,lr,rr)
//         }
        
//         let split_vec:( Thk[0] foralli (X,Y):NmSet.
//             0 Nm[X] -> 0 NatVec ->
//             {{WS_Bin} X; 0} F Set[X][{WS_Bin} X]
//         ) = {
//             ret thunk #nm. #vec.
//             let vs : (x NatVec x NatVec) = {
//                 // vector ops with `vec`
//                 // split `vec` appropriate to trie
//                 unimplemented
//             }
//             let (v1,v2) = {ret vs}
//             let bin = { {force join_vecs} nm v1 v2 }
//             ret bin
//         }
        
//         // let join:(
//         //     Thk[0] foralli (X0, X1, X2, Y1, Y2):NmSet.
//         //         0 Nm[X0] ->
//         //         0 Set[X1][Y1] ->
//         //         0 Set[X2][Y2] ->
//         //     {
//         //         ({WS_Bin} X0)
//         //         % ({WS_Join} (X1%X2))
//         //     ;
//         //         Y1 % Y2
//         //         % ({WS_Bin} X0)
//         //         % ({WS_Join} (X1%X2))
//         //     }
//         //     F Set
//         //         [(Join)(X1 % X2)]
//         //         [{WS_Join}(X1 % X2)]
//         // ) = {
//         //     ret thunk fix join. #nm. #set1. #set2. match set1 {
//         //         on1 => { match set2 {
//         //             on2  => { unimplemented }
//         //             bin2 => { unimplemented }
//         //         }}
//         //         bin1 => { match set2 {
//         //             on2  => { unimplemented }
//         //             bin2 => {
//         //                 // XXX
//         //                 unimplemented
//         //             }
//         //         }}
//         //     }
//         // }

//         // let trie:(
//         //     Thk[0] foralli (X,Y):NmSet.
//         //         0 Seq[X][Y] ->
//         //     {
//         //         {WS_Trie} X
//         //             ;
//         //         Y % ( {WS_Trie} X )
//         //     }
//         //     F Set[X][{WS_Trie} X]
//         // ) = {
//         //     ret thunk fix trie. #seq. match seq {
//         //         on => { ret roll inj1 on }
//         //         bin => {
//         //             unpack (X1,X2,X3,Y1,Y2,Y3,Y4) bin = bin
//         //             let (n,lev,l,r) = {ret bin}
//         //             let (rsl, _l) = { memo{n,(@1)}{ {force trie}[X2][Y2]{!l} } }
//         //             let (rsr, _r) = { memo{n,(@2)}{ {force trie}[X3][Y4]{!r} } }
//         //             let trie      = { ws (nmfn [#x:Nm. ~n * x]) {
//         //                 {force join}
//         //                 [({Trie}X2)][({Trie}X3)][({WS_Trie}X2)][({WS_Trie}X3)]
//         //                 {!rsl} {!rsr}
//         //             }}
//         //             ret trie
//         //         }
//         //     }
//         // }

//         ret 0
//     ];

//     // println!("trie AST");
//     // println!("-------------");
//     // println!("{:?}", trie_ast);
//     // let typed = synth_exp(&Ext::empty(), &Ctx::Empty, &trie_ast);
//     // println!("trie typing derivation");
//     // println!("----------------------");
//     // println!("typing success: {:?}", typed.clas.is_ok());
//     // println!("{:?}", typed);

//     write_bundle("target/trie.fgb", &bundle);
// }