fgi_mod!{
type Chk = (
forallt a:type.
foralli (X,Y):NmSet.
Nm[X] x Ref[Y](Vec a)
)
fn chk_reduce:(
Thk[0] forallt (a,b):type.
foralli (X,Y):NmSet.
0 (Chk[X][Y] a) ->
0 (Thk[0] 0 Vec a -> 0 F b) ->
{X; Y}
F ((Ref[X] b) x b)
) = {
#c.#f.
let (n,r) = {ret c}
memo(n){ {force f} {!r} }
}
fn chk_filter:(
Thk[0] forallt a:type.
0 (Chk[X][Y] a) ->
0 (Thk[0] 0 a -> 0 F Bool) ->
{X; Y}
F (Chk[X][X] a)
) = {
#c.#f.
let (rout,_x) = {
{force chk_reduce}
c (thunk #vec. {force vec_filter} f)
}
ret (n,rout)
}
fn chk_filter__inlined_version:(
Thk[0] forallt a:type.
0 (Chk[X][Y] a) ->
0 (Thk[0] 0 a -> 0 F Bool) ->
{X; Y}
F (Chk[X][X] a)
) = {
#c.#f.
let (n,rinp) = { ret c }
let (rout,_x) = { memo(n){
{force vec_filter} f {!rinp}
} }
ret (n,rout)
}
fn chk_map:(
Thk[0] forallt (a,b):type.
foralli (X,Y):NmSet.
0 Chk[X][Y] a ->
0 (Thk[0] 0 a -> 0 F b) ->
{X; Y}
F (Chk[X][X] b)
) = {
#c.#f.
let (n,rinp) = {ret c}
let (rout,_x) = { memo(n){
{force vec_map} f {!rinp}
} }
ret ((n,rout))
}
}