up

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

up_qor_rrsin.c (1715B)


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