1 /* j/6/fire.c
2 **
3 */
4 #include "all.h"
5 
6 
7 /* logic
8 */
9   static u3_noun
_fire_vet(u3_noun van)10   _fire_vet(u3_noun van)
11   {
12     // u3_noun vet = u3j_hook(u3k(van), "vet");
13     u3_noun vet = u3r_at(u3qfu_van_vet, van);
14 
15     switch ( vet ) {
16       case c3n:
17       case c3y: return vet;
18       default: return u3m_bail(c3__fail);
19     }
20   }
21 
22   static u3_noun
_fire_mull(u3_noun van,u3_noun sut,u3_noun dox,u3_noun gen)23   _fire_mull(u3_noun van,
24              u3_noun sut,
25              u3_noun dox,
26              u3_noun gen)
27   {
28     u3_noun rib = u3r_at(u3qfu_van_rib, van);
29     u3_noun key = u3nt(u3k(sut),
30                        u3k(dox),
31                        u3k(gen));
32     u3_noun ret;
33 
34     if ( c3n == _fire_vet(van) ) {
35       ret = c3y;
36     }
37     if ( c3y == u3qdi_has(rib, key) ) {
38       ret = c3y;
39     }
40     else {
41       u3_noun rob = u3qdi_put(rib, key);
42       u3_noun von = u3i_molt(u3k(van),
43                              u3qfu_van_rib,
44                              u3k(rob),
45                              0);
46       u3_noun mul = u3qfu_mull(von, sut, c3__noun, dox, gen);
47 
48       ret = c3y;
49 
50       u3z(mul);
51       u3z(von);
52       u3z(rob);
53     }
54     u3z(key);
55     return ret;
56   }
57 
58   static u3_noun
_fire_each(u3_noun van,u3_noun vet,u3_noun typ,u3_noun gat)59   _fire_each(u3_noun van,
60              u3_noun vet,
61              u3_noun typ,
62              u3_noun gat)
63   {
64     u3_noun p_typ, q_typ, pq_typ, qq_typ, rq_typ;
65     u3_noun h_gat, t_gat;
66 
67     if ( (c3n == u3du(typ)) || (c3__core != u3h(typ)) ) {
68       return u3m_error("fire-core");
69     } else if
70          ( (c3n == u3r_cell(u3t(typ), &p_typ, &q_typ)) ||
71            (c3n == u3r_trel(q_typ, &pq_typ, &qq_typ, &rq_typ)) ||
72            (c3n == u3r_cell(gat, &h_gat, &t_gat)) )
73     {
74       return u3m_bail(c3__fail);
75     } else {
76       u3_noun dox = u3nt
77         (c3__core, u3k(qq_typ), u3k(q_typ));
78 
79       if ( c3__ash == u3h(gat) ) {
80         if ( (c3y == vet) &&
81              (c3n == u3qfu_nest(van, qq_typ, c3y, p_typ)) )
82         {
83 #if 0
84           u3_noun dun = u3qfu_dunq(van, "need", qq_typ);
85           u3_noun niz = u3qfu_dunq(van, "have", p_typ);
86 
87           u3t_push(u3nc(c3__mean, niz));
88           u3t_push(u3nc(c3__mean, dun));
89 #endif
90           return u3m_error("fire-dry");
91         }
92         else {
93           return u3nc(dox, u3k(t_gat));
94         }
95       }
96       else {
97         c3_assert(c3__elm == u3h(gat));
98 #if 0
99         u3_noun dun = u3qfu_dunq(van, "wild", typ);
100         u3_noun niz = u3qfu_dunq(van, "tame", dox);
101 
102         u3t_push(u3nc(c3__mean, dun));
103         u3t_push(u3nc(c3__mean, niz));
104 #endif
105         if ( (c3y == vet) &&
106              (c3n == _fire_mull(van, typ, dox, t_gat)) )
107         {
108           return u3m_error("fire-wet");
109         }
110         else {
111           u3z(dox);
112 #if 0
113           u3t_drop();
114           u3t_drop();
115 #endif
116           return u3nc(u3k(typ), u3k(t_gat));
117         }
118       }
119     }
120   }
121 
122   static u3_noun
_fire_in(u3_noun van,u3_noun vet,u3_noun hag)123   _fire_in(u3_noun van,
124            u3_noun vet,
125            u3_noun hag)
126   {
127     if ( u3_nul == hag ) {
128       return u3_nul;
129     }
130     else {
131       u3_noun i_hag = u3h(hag);
132       u3_noun t_hag = u3t(hag);
133 
134       if ( c3n == u3du(i_hag) ) {
135         return u3m_bail(c3__fail);
136       } else {
137         return u3nc
138           (_fire_each(van, vet, u3h(i_hag), u3t(i_hag)),
139                       _fire_in(van, vet, t_hag));
140       }
141     }
142   }
143 
144   static u3_noun
_cqfu_fire(u3_noun van,u3_noun sut,u3_noun hag)145   _cqfu_fire(u3_noun van,
146              u3_noun sut,
147              u3_noun hag)
148   {
149     u3_noun vet = u3r_at(u3qfu_van_vet, van);
150 
151     c3_assert(!"not live");
152     {
153       if ( (c3y == u3du(hag)) && (u3_nul == u3t(hag)) ) {
154         u3_noun i_hag = u3h(hag);
155         u3_noun pi_hag = u3h(i_hag);
156         u3_noun qi_hag = u3t(i_hag);
157 
158         if ( c3__elm == u3h(qi_hag) ) {
159           u3_noun qqi_hag = u3t(qi_hag);
160 
161           if ( c3y == u3du(qqi_hag) &&
162               (u3_nul == u3h(qqi_hag)) &&
163               (1 == u3t(qqi_hag)) )
164           {
165             return u3k(pi_hag);
166           }
167         }
168       }
169     }
170     return u3nc(c3__hold, _fire_in(van, vet, hag));
171   }
172 
173 /* boilerplate
174 */
175   u3_noun
u3wfu_fire(u3_noun cor)176   u3wfu_fire(u3_noun cor)
177   {
178     u3_noun sut, hag, van;
179 
180     if ( (c3n == u3r_mean(cor, u3x_sam, &hag, u3x_con, &van, 0)) ||
181          (u3_none == (sut = u3r_at(u3x_sam, van))) )
182     {
183       return u3m_bail(c3__fail);
184     } else {
185       return _cqfu_fire(van, sut, hag);
186     }
187   }
188 
189   u3_noun
u3qfu_fire(u3_noun van,u3_noun sut,u3_noun hag)190   u3qfu_fire(u3_noun van,
191                         u3_noun sut,
192                         u3_noun hag)
193   {
194     return _cqfu_fire(van, sut, hag);
195   }
196