up

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

up_qor_llsin.c (1700B)


      1 #include "all.h"
      2 
      3 u3_noun
      4 u3qdu_qor_llsin(u3_noun n_a, u3_noun l_a, u3_noun m_a, u3_noun r_a)
      5 {
      6   if ( c3n == u3du(r_a) ) {
      7     return u3m_bail(c3__exit);
      8   }
      9 
     10   u3_noun b = u3t(u3t(r_a));
     11 
     12   u3_noun n_b, l_b, m_b, r_b;
     13   u3_noun k_n_b, t_b;
     14   u3x_qual(b, &n_b, &l_b, &m_b, &r_b);
     15   u3x_cell(n_b, &k_n_b, &t_b);
     16 
     17   u3_noun p_n_b = u3h(t_b);
     18   u3_noun hor = u3h(r_a);
     19 
     20   if ( c3n == u3ud(hor) ) {
     21     return u3m_bail(c3__exit);
     22   }
     23   else switch ( hor ) {
     24     default:
     25       return u3m_bail(c3__exit);
     26 
     27     case c3__llos: {
     28       u3_noun k_n_a, t_a;
     29       u3x_cell(n_a, &k_n_a, &t_a);
     30 
     31       u3_noun p_n_a = u3h(t_a);
     32 
     33       if ( (c3n == u3ud(p_n_a)) || (c3n == u3ud(p_n_b)) ) {
     34         return u3m_bail(c3__exit);
     35       }
     36 
     37       if ( c3y == u3qdu_lex(p_n_a, k_n_a, p_n_b, k_n_b) ) {
     38         u3_noun pre = u3qdu_qor_rlos(n_b, l_a, m_a, l_b);
     39         u3_noun pro = u3qdu_qor_llos(n_a, pre, m_b, r_b);
     40 
     41         u3z(pre);
     42 
     43         return pro;
     44       }
     45       else {
     46         u3_noun pre = u3qdu_qor_llos(n_a, l_a, m_a, l_b);
     47         u3_noun pro = u3qdu_qor_llos(n_b, pre, m_b, r_b);
     48 
     49         u3z(pre);
     50 
     51         return pro;
     52       }
     53     }
     54 
     55     case c3__rlos: {
     56       u3_noun pre = u3qdu_qor_llos(n_a, l_a, m_a, l_b);
     57       u3_noun pro = u3qdu_qor_rlos(n_b, pre, m_b, r_b);
     58 
     59       u3z(pre);
     60 
     61       return pro;
     62     }
     63   }
     64 }
     65 
     66 u3_noun
     67 u3wdu_qor_llsin(u3_noun cor)
     68 {
     69   u3_noun a;
     70 
     71   if ( (c3n == u3r_mean(cor, u3x_sam, &a, 0 )) ||
     72        (c3n == u3du(a)) )
     73   {
     74     return u3m_bail(c3__exit);
     75   } else {
     76     u3_noun n, l, m, r;
     77     u3x_qual(a, &n, &l, &m, &r);
     78 
     79     if ( (c3n == u3du(n)) || (c3n == u3ud(m)) ) {
     80       return u3m_bail(c3__exit);
     81     }
     82     else {
     83       return u3qdu_qor_llsin(n, l, m, r);
     84     }
     85   }
     86 }
     87