Esempio n. 1
0
File: iter.c Progetto: matz/streem
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;
}
Esempio n. 2
0
File: iter.c Progetto: matz/streem
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;
}
Esempio n. 3
0
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()));
  }
}