Fork me on GitHub
Source file: segreduce.fut

Irregular segmented reduction

Accepts an irregular array encoded as a value vector and a flag vector, then performs a segmented reduction. The idea is to do a segmented scan, then extract the last element of every segment.

import "segscan"

def segreduce 't [n]
              (op: t -> t -> t)
              (ne: t)
              (flags: [n]bool)
              (vals: [n]t) : ?[m].[m]t =
  segscan op ne flags vals
  |> zip (rotate 1 flags)
  |> filter (.0)
  |> map (.1)

def segsum = segreduce (+) 0i32
>  segsum [true, true, false, true, false, false]
          [1,2,3,4,5,6]
[1i32, 5i32, 15i32]