USING: arrays continuations kernel namespaces sequences ; IN: amb : amb ( sequence -- elt ) [ swap [ [ amb-failure set continue-with ] callcc0 2drop ] curry amb-failure get [ each ] dip continue ] curry callcc1 ; : amb-init ( -- ) [ amb-failure set t ] callcc1 [ amb-init "amb: no more alternatives" throw ] unless ; : amb-fail ( -- ) amb-failure get continue ; : bag-of ( quot -- seq ) { } clone [ [ swap push amb-fail ] curry compose [ ] 2array amb call ] keep ;