(* %use "BMF/scan.fsh" ;; only for vectors. *) let scan_pr f u (y:var b) (x: var a) = (y[0] := u ; for 1<= i< lendim #x do y[i] := f !y[i-1] !x[i-1] done) ;; let scan f u = proc2fun (scan_pr f u) identity ;; let scan_back_pr f u (y:var b) (x:var a) = let n = lendim #x in y[n-1] := u ; for (1<= i< n ) do y[n-i-1] := f !y[n-i] !x[n-i] done ;; let scan_back f u = proc2fun (scan_back_pr f u) identity ;; (* ----------- *) let scan_no_unit_pr f (y:var b) (x:var a) = (y[0] := x[0] ; for 1<= i< lendim #x do y[i] := f !y[i-1] !x[i] done) ;; let scan_no_unit f = proc2fun (scan_no_unit_pr f) identity ;; let scan_back_no_unit_pr f (y:var b) (x:var a) = let n = lendim #x in y[n-1] := x[n-1] ; for 1<= i< n do y[n-i-1] := f !y[n-i] !x[n-i-1] done ;; let scan_back_no_unit f = proc2fun (scan_back_no_unit_pr f) identity ;; (* let scantest = scan plus_int 0 (fill {3:int_shape} with [1,2,3]) ;; let scan_backtest = scan_back plus_int 0 (fill {3:int_shape} with [1,2,3]) ;; *)