! Copyright (C) 2010 Jon Harper. ! See http://factorcode.org/license.txt for BSD license. USING: arrays assocs combinators combinators.short-circuit kernel macros math math.order quotations random sequences summary ; IN: combinators.random : ifp ( p true false -- ) [ random-unit > ] 2dip if ; inline : whenp ( p true -- ) [ ] ifp ; inline : unlessp ( p false -- ) [ [ ] ] dip ifp ; inline quot) ( assoc -- quot ) dup good-probabilities? [ [ dup pair? [ prepare-pair ] [ with-drop ] if ] map cond>quot ] [ bad-probabilities ] if ; MACRO: (casep) ( assoc -- ) (casep>quot) ; : casep>quot ( assoc -- quot ) (casep>quot) [ random-unit ] prepend ; : (conditional-probabilities) ( seq i -- p ) [ dup 0 > [ head [ 1 swap - ] [ * ] map-reduce ] [ 2drop 1 ] if ] [ swap nth ] 2bi * ; : conditional-probabilities ( seq -- seq' ) dup length iota [ (conditional-probabilities) ] with map ; : (direct>conditional) ( assoc -- assoc' ) [ keys conditional-probabilities ] [ values ] bi zip ; : direct>conditional ( assoc -- assoc' ) dup last pair? [ (direct>conditional) ] [ unclip-last [ (direct>conditional) ] [ suffix ] bi* ] if ; : call-random>casep ( seq -- assoc ) [ length recip ] keep [ 2array ] with map ; PRIVATE> MACRO: casep ( assoc -- ) casep>quot ; MACRO: casep* ( assoc -- ) direct>conditional casep>quot ; MACRO: call-random ( seq -- ) call-random>casep casep>quot ; MACRO: execute-random ( seq -- ) [ 1quotation ] map call-random>casep casep>quot ;