up

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

up_get.c (1612B)


      1 #include "all.h"
      2 
      3 u3_noun
      4 u3qdu_get(u3_noun a, u3_noun k)
      5 {
      6   if (u3_nul == a) {
      7     return u3_nul;
      8   }
      9 
     10   u3_atom hoc = u3h(a);
     11 
     12   if (c3n == u3ud(hoc)) {
     13     return u3m_bail(c3__exit);
     14   }
     15   else switch ( hoc) {
     16     default:
     17       return u3m_bail(c3__exit);
     18 
     19     case c3__tip: {
     20       u3_noun ka, pa, va;
     21       u3x_trel(u3t(a), &ka, &pa, &va);
     22 
     23       u3_noun vva, tva;
     24       u3x_cell(va, &vva, &tva);
     25 
     26       u3_atom mk  = u3r_mug(k);
     27       u3_atom mka = u3r_mug(ka);
     28 
     29       if (c3n == u3r_sing(mk, mka)) {
     30         return u3_nul;
     31       }
     32       else if (c3y == u3r_sing(k, ka)) {
     33         return u3nt(u3_nul, u3k(pa), u3k(vva));
     34       }
     35       else {
     36         return u3qdu_qor_get(tva, k);
     37       }
     38     }
     39 
     40     case c3__bin: {
     41       u3_noun ka, pa, va, ta;
     42       u3_noun vva, tva;
     43       u3_noun ma, la, ra;
     44 
     45       u3x_qual(u3t(a), &ka, &pa, &va, &ta);
     46       u3x_cell(va, &vva, &tva);
     47       u3x_trel(ta, &ma, &la, &ra);
     48 
     49       u3_noun mk  = u3r_mug(k);
     50       u3_noun mka = u3r_mug(ka);
     51 
     52       if (c3y == u3qdu_feud(ma, k, ka)) {
     53         return u3_nul;
     54       }
     55       else if (c3y == u3r_sing(mk, mka)) {
     56         if (c3y == u3r_sing(k, ka)) {
     57           return u3nt(u3_nul, u3k(pa), u3k(vva));
     58         }
     59         else {
     60           return u3qdu_qor_get(tva, k);
     61         }
     62       }
     63       else if (c3y == u3qdu_zero(ma, k)) {
     64         return u3qdu_get(la, k);
     65       }
     66       else {
     67         return u3qdu_get(ra, k);
     68       }
     69     }
     70   }
     71 }
     72 
     73 u3_noun
     74 u3wdu_get(u3_noun cor)
     75 {
     76   u3_noun a, k;
     77 
     78   if (c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &k, 0))
     79   {
     80     return u3m_bail(c3__exit);
     81   } else {
     82     return u3qdu_get(a, k);
     83   }
     84 }
     85 
     86