up

A priority search queue and LRU cache.
git clone git://git.jtobin.io/up.git
Log | Files | Refs

up_cut.c (1290B)


      1 #include "all.h"
      2 
      3 u3_noun
      4 u3qdu_cut(u3_noun a)
      5 {
      6   if (u3_nul == a) {
      7     return u3_nul;
      8   }
      9 
     10   u3_noun lal = u3h(a);
     11 
     12   if (c3n == u3ud(lal)) {
     13     return u3m_bail(c3__exit);
     14   }
     15   else switch ( lal ) {
     16     default:
     17       return u3m_bail(c3__exit);
     18 
     19     case c3__tip: {
     20       u3_noun ka, pa, va, vva, tva;
     21       u3x_trel(u3t(a), &ka, &pa, &va);
     22       u3x_cell(va, &vva, &tva);
     23 
     24       u3_noun hol = u3qdu_qor_bot(tva);
     25       u3_noun pro = (u3_nul == hol) ? u3_nul : u3nc(c3__tip, u3k(u3t(hol)));
     26 
     27       u3z(hol);
     28       return pro;
     29     }
     30 
     31     case c3__bin: {
     32       u3_noun ka, pa, va, ta, vva, tva;
     33       u3_noun ma, la, ra;
     34 
     35       u3x_qual(u3t(a), &ka, &pa, &va, &ta);
     36       u3x_cell(va, &vva, &tva);
     37       u3x_trel(ta, &ma, &la, &ra);
     38 
     39       u3_noun hol = u3qdu_qor_bot(tva);
     40 
     41       if (u3_nul == hol) {
     42         return u3qdu_fuse(ma, la, ra);
     43       }
     44       else {
     45         u3_noun kh, ph, vh;
     46         u3x_trel(u3t(hol), &kh, &ph, &vh);
     47 
     48         u3_noun pre = u3qdu_fuse(ma, la, ra);
     49         u3_noun pro = u3qdu_qat_raw(pre, kh, ph, vh);
     50 
     51         u3z(hol);
     52         u3z(pre);
     53 
     54         return pro;
     55       }
     56     }
     57   }
     58 }
     59 
     60 u3_noun
     61 u3wdu_cut(u3_noun cor)
     62 {
     63   u3_noun a;
     64 
     65   if ( (c3n == u3r_mean(cor, u3x_sam, &a, 0)) )
     66   {
     67     return u3m_bail(c3__exit);
     68   } else {
     69     return u3qdu_cut(a);
     70   }
     71 }
     72 
     73