static int iter_minmax(strm_stream* strm, strm_value data) { struct minmax_data* d = strm->data; strm_value e; double num; if (!strm_nil_p(d->func)) { if (strm_funcall(strm, d->func, 1, &data, &e) == STRM_NG) { return STRM_NG; } } else { e = data; } num = strm_value_float(e); if (d->start) { d->start = FALSE; d->num = num; d->data = data; } else if (d->min) { /* min */ if (d->num > num) { d->num = num; d->data = data; } } else { /* max */ if (d->num < num) { d->num = num; d->data = data; } } return STRM_OK; }
static int exec_uniq(strm_stream* strm, int argc, strm_value* args, strm_value* ret) { struct uniq_data* d; strm_value func = strm_nil_value(); strm_get_args(strm, argc, args, "|v", &func); d = malloc(sizeof(*d)); if (!d) return STRM_NG; d->last = strm_nil_value(); d->func = func; d->init = FALSE; *ret = strm_stream_value(strm_stream_new(strm_filter, strm_nil_p(func) ? iter_uniq : iter_uniqf, NULL, (void*)d)); return STRM_OK; }
void strm_emit(strm_task* task, strm_value data, strm_callback func) { strm_task *d = task->dst; int tid = task->tid; if (!strm_nil_p(data)) { while (d) { task_push(tid, strm_queue_task(d, d->start_func, data)); d = d->nextd; tid++; } } if (func) { strm_task_push(strm_queue_task(task, func, strm_nil_value())); } }