static int iter_correl(strm_stream* strm, strm_value data) { struct correl_data* d = strm->data; strm_value *v; double dx, dy; if (!strm_array_p(data) || strm_ary_len(data) != 2) { strm_raise(strm, "invalid data"); return STRM_NG; } v = strm_ary_ptr(data); if (!strm_number_p(v[0]) || !strm_number_p(v[1])) { strm_raise(strm, "correl() requires [num, num]"); return STRM_NG; } d->n++; dx = strm_value_flt(v[0]) - d->sx; d->sx += dx / d->n; dy = strm_value_flt(v[1]) - d->sy; d->sy += dy / d->n; d->sxx += (d->n-1) * dx * dx / d->n; d->syy += (d->n-1) * dy * dy / d->n; d->sxy += (d->n-1) * dx * dy / d->n; return STRM_OK; }
int strm_value_eq(strm_value a, strm_value b) { if (a == b) return TRUE; if (strm_value_tag(a) != strm_value_tag(b)) goto typediff; switch (strm_value_tag(a)) { case STRM_TAG_STRUCT: return strm_ary_eq(a, b); case STRM_TAG_STRING_O: case STRM_TAG_STRING_F: return strm_str_eq(a, b); case STRM_TAG_CFUNC: return (strm_cfunc)(intptr_t)strm_value_val(a) == (strm_cfunc)(intptr_t)strm_value_val(b); case STRM_TAG_PTR: return strm_value_vptr(a) == strm_value_vptr(b); typediff: default: if (strm_number_p(a) && strm_number_p(b)) { return strm_value_flt(a) == strm_value_flt(b); } return FALSE; } }
static strm_value convert_number(strm_stream* strm, strm_value data, strm_value func) { strm_value val; if (strm_funcall(strm, func, 1, &data, &val) == STRM_NG) { return STRM_NG; } if (!strm_number_p(val)) { strm_raise(strm, "number required"); return STRM_NG; } return val; }
static int iter_sum(strm_stream* strm, strm_value data) { struct sum_data* d = strm->data; double f, y, t; if (!strm_number_p(data)) { return STRM_NG; } f = strm_value_flt(data); y = f - d->c; t = d->sum + y; d->c = (t - d->sum) - y; d->sum = t; d->num++; return STRM_OK; }
static int iter_bar(strm_stream* strm, strm_value data) { struct bar_data* d = strm->data; double f, max = 1.0; if (interrupt) { interrupt = FALSE; strm_unsignal(SIGINT, sigupdate); move_cursor(d->row-1, 1); show_cursor(); exit(1); } if (!strm_number_p(data)) { strm_raise(strm, "invalid data"); return STRM_NG; } if (winch) { winch = FALSE; free(d->data); if (init_bar(d) == STRM_NG) { strm_stream_close(strm); return STRM_NG; } } f = strm_value_float(data); if (f < 0) f = 0; d->data[d->offset++] = f; max = 1.0; for (int i=0; i<d->dlen; i++) { f = d->data[i]; if (f > max) max = f; } d->max = max; if (d->offset == d->dlen) { d->offset = 0; } show_graph(d); return STRM_OK; }
strm_state* strm_value_ns(strm_value val) { if (strm_array_p(val)) { strm_state* ns = strm_ary_ns(val); if (ns) return ns; return strm_ns_array; } if (strm_string_p(val)) { return strm_ns_string; } if (strm_number_p(val)) { return strm_ns_number; } if (strm_value_tag(val) == STRM_TAG_PTR) { struct strm_misc* p = strm_ptr(val); if (!p) return NULL; if (strm_ptr_type(p) == STRM_PTR_AUX) { return p->ns; } } return NULL; }