Merge commit 'littledan/master'
						commit
						36a1fb9bc3
					
				|  | @ -0,0 +1,113 @@ | ||||||
|  | ! Copyright (C) 2007 Daniel Ehrenberg | ||||||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||||||
|  | USING: xml kernel sequences xml.utilities combinators.lib | ||||||
|  | math xml.data arrays assocs xml.generator namespaces math.parser ; | ||||||
|  | IN: faq | ||||||
|  | 
 | ||||||
|  | : find-after ( seq quot -- elem after ) | ||||||
|  |     over >r find r> rot 1+ tail ; inline | ||||||
|  | 
 | ||||||
|  | : tag-named? ( tag name -- ? ) | ||||||
|  |     assure-name swap (get-tag) ; | ||||||
|  | 
 | ||||||
|  | ! Questions | ||||||
|  | TUPLE: q/a question answer ; | ||||||
|  | C: <q/a> q/a | ||||||
|  | 
 | ||||||
|  | : li>q/a ( li -- q/a ) | ||||||
|  |     [ "br" tag-named? not ] subset | ||||||
|  |     [ "strong" tag-named? ] find-after | ||||||
|  |     >r tag-children r> <q/a> ; | ||||||
|  | 
 | ||||||
|  | : q/a>li ( q/a -- li ) | ||||||
|  |     [ q/a-question "strong" build-tag* f "br" build-tag* 2array ] keep | ||||||
|  |     q/a-answer append "li" build-tag* ; | ||||||
|  | 
 | ||||||
|  | : xml>q/a ( xml -- q/a ) | ||||||
|  |     [ "question" tag-named tag-children ] keep | ||||||
|  |     "answer" tag-named tag-children <q/a> ; | ||||||
|  | 
 | ||||||
|  | : q/a>xml ( q/a -- xml ) | ||||||
|  |     [ q/a-question "question" build-tag* ] keep | ||||||
|  |     q/a-answer "answer" build-tag* | ||||||
|  |     "\n" swap 3array "qa" build-tag* ; | ||||||
|  | 
 | ||||||
|  | ! Lists of questions | ||||||
|  | TUPLE: question-list title seq ; | ||||||
|  | C: <question-list> question-list | ||||||
|  | 
 | ||||||
|  | : xml>question-list ( list -- question-list ) | ||||||
|  |     [ "title" swap at ] keep | ||||||
|  |     tag-children [ tag? ] subset [ xml>q/a ] map | ||||||
|  |     <question-list> ; | ||||||
|  | 
 | ||||||
|  | : question-list>xml ( question-list -- list ) | ||||||
|  |     [ question-list-seq [ q/a>xml "\n" swap 2array ] | ||||||
|  |       map concat "list" build-tag* ] keep | ||||||
|  |     question-list-title [ "title" pick set-at ] when* ; | ||||||
|  | 
 | ||||||
|  | : html>question-list ( h3 ol -- question-list ) | ||||||
|  |     >r [ children>string ] [ f ] if* r> | ||||||
|  |     children-tags [ li>q/a ] map <question-list> ; | ||||||
|  | 
 | ||||||
|  | : question-list>h3 ( id question-list -- h3 ) | ||||||
|  |     question-list-title [ | ||||||
|  |         "h3" build-tag | ||||||
|  |         swap number>string "id" pick set-at | ||||||
|  |     ] [ drop f ] if* ; | ||||||
|  | 
 | ||||||
|  | : question-list>html ( question-list start id -- h3/f ol ) | ||||||
|  |     -rot >r [ question-list>h3 ] keep | ||||||
|  |     question-list-seq [ q/a>li ] map "ol" build-tag* r> | ||||||
|  |     number>string "start" pick set-at | ||||||
|  |     "margin-left: 5em" "style" pick set-at ; | ||||||
|  | 
 | ||||||
|  | ! Overall everything | ||||||
|  | TUPLE: faq header lists ; | ||||||
|  | C: <faq> faq | ||||||
|  | 
 | ||||||
|  | : html>faq ( div -- faq ) | ||||||
|  |     unclip swap { "h3" "ol" } [ tags-named ] curry* map | ||||||
|  |     first2 >r f add* r> [ html>question-list ] 2map <faq> ; | ||||||
|  | 
 | ||||||
|  | : header, ( faq -- ) | ||||||
|  |     dup faq-header , | ||||||
|  |     faq-lists first 1 -1 question-list>html nip , ; | ||||||
|  | 
 | ||||||
|  | : br, ( -- ) | ||||||
|  |     "br" contained, nl, ; | ||||||
|  | 
 | ||||||
|  | : toc-link, ( question-list number -- ) | ||||||
|  |     number>string "#" swap append "href" swap 2array 1array | ||||||
|  |     "a" swap [ question-list-title , ] tag*, br, ; | ||||||
|  | 
 | ||||||
|  | : toc, ( faq -- ) | ||||||
|  |     "div" { { "style" "background-color: #eee; margin-left: 30%; margin-right: 30%; width: auto; padding: 5px; margin-top: 1em; margin-bottom: 1em" } } [ | ||||||
|  |         "strong" [ "The big questions" , ] tag, br, | ||||||
|  |         faq-lists 1 tail dup length [ toc-link, ] 2each | ||||||
|  |     ] tag*, ; | ||||||
|  | 
 | ||||||
|  | : faq-sections, ( question-lists -- ) | ||||||
|  |     unclip question-list-seq length 1+ dupd | ||||||
|  |     [ question-list-seq length + ] accumulate nip | ||||||
|  |     0 -rot [ pick question-list>html [ , nl, ] 2apply 1+ ] 2each drop ; | ||||||
|  | 
 | ||||||
|  | : faq>html ( faq -- div ) | ||||||
|  |     "div" [ | ||||||
|  |         dup header, | ||||||
|  |         dup toc, | ||||||
|  |         faq-lists faq-sections, | ||||||
|  |     ] make-xml ; | ||||||
|  | 
 | ||||||
|  | : xml>faq ( xml -- faq ) | ||||||
|  |     [ "header" tag-named children>string ] keep | ||||||
|  |     "list" tags-named [ xml>question-list ] map <faq> ; | ||||||
|  | 
 | ||||||
|  | : faq>xml ( faq -- xml ) | ||||||
|  |     "faq" [ | ||||||
|  |         "header" [ dup faq-header , ] tag, | ||||||
|  |         faq-lists [ question-list>xml , nl, ] each | ||||||
|  |     ] make-xml ; | ||||||
|  | 
 | ||||||
|  | : read-write-faq ( xml-stream -- ) | ||||||
|  |     [ read-xml ] with-stream xml>faq faq>html write-xml ; | ||||||
|  | @ -18,13 +18,13 @@ IN: random-tester | ||||||
| : random-string | : random-string | ||||||
|     [ max-length random [ max-value random , ] times ] "" make ; |     [ max-length random [ max-value random , ] times ] "" make ; | ||||||
| 
 | 
 | ||||||
| SYMBOL: special-integers | : special-integers ( -- seq ) \ special-integers get ; | ||||||
| [ { -1 0 1 } % most-negative-fixnum , most-positive-fixnum , first-bignum , ]  | [ { -1 0 1 } % most-negative-fixnum , most-positive-fixnum , first-bignum , ]  | ||||||
| { } make \ special-integers set-global | { } make \ special-integers set-global | ||||||
| SYMBOL: special-floats | : special-floats ( -- seq ) \ special-floats get ; | ||||||
| [ { 0.0 -0.0 } % e , pi , 1./0. , -1./0. , 0./0. , epsilon , epsilon neg , ] | [ { 0.0 -0.0 } % e , pi , 1./0. , -1./0. , 0./0. , epsilon , epsilon neg , ] | ||||||
| { } make \ special-floats set-global | { } make \ special-floats set-global | ||||||
| SYMBOL: special-complexes | : special-complexes ( -- seq ) \ special-complexes get ; | ||||||
| [  | [  | ||||||
|     { -1 0 1 C{ 0 1 } C{ 0 -1 } } % |     { -1 0 1 C{ 0 1 } C{ 0 -1 } } % | ||||||
|     e , e neg , pi , pi neg , |     e , e neg , pi , pi neg , | ||||||
|  |  | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| USING: arrays assocs combinators.lib continuations kernel | USING: arrays assocs combinators.lib continuations kernel | ||||||
| math math.functions memoize namespaces quotations random sequences | math math.functions memoize namespaces quotations random sequences | ||||||
| sequences.private shuffle ; | sequences.private shuffle ; | ||||||
| 
 |  | ||||||
| IN: random-tester.utils | IN: random-tester.utils | ||||||
| 
 | 
 | ||||||
| : %chance ( n -- ? ) | : %chance ( n -- ? ) | ||||||
|  | @ -17,7 +16,7 @@ IN: random-tester.utils | ||||||
| : 80% ( -- ? ) 80 %chance ; | : 80% ( -- ? ) 80 %chance ; | ||||||
| : 90% ( -- ? ) 90 %chance ; | : 90% ( -- ? ) 90 %chance ; | ||||||
| 
 | 
 | ||||||
| : call-if ( quot ? -- ) [ call ] [ drop ] if ; inline | : call-if ( quot ? -- ) swap when ; inline | ||||||
| 
 | 
 | ||||||
| : with-10% ( quot -- ) 10% call-if ; inline | : with-10% ( quot -- ) 10% call-if ; inline | ||||||
| : with-20% ( quot -- ) 20% call-if ; inline | : with-20% ( quot -- ) 20% call-if ; inline | ||||||
|  | @ -29,78 +28,7 @@ IN: random-tester.utils | ||||||
| : with-80% ( quot -- ) 80% call-if ; inline | : with-80% ( quot -- ) 80% call-if ; inline | ||||||
| : with-90% ( quot -- ) 90% call-if ; inline | : with-90% ( quot -- ) 90% call-if ; inline | ||||||
| 
 | 
 | ||||||
| : random-hash-key keys random ; | : random-key keys random ; | ||||||
| : random-hash-value [ random-hash-key ] keep at ; | : random-value [ random-key ] keep at ; | ||||||
| 
 | 
 | ||||||
| : do-one ( seq -- ) random call ; inline | : do-one ( seq -- ) random call ; inline | ||||||
| 
 |  | ||||||
| TUPLE: p-list seq max count count-vec ; |  | ||||||
| 
 |  | ||||||
| : reset-array ( seq -- ) |  | ||||||
|     [ drop 0 ] over map-into ; |  | ||||||
| 
 |  | ||||||
| C: <p-list> p-list |  | ||||||
| 
 |  | ||||||
| : make-p-list ( seq n -- tuple ) |  | ||||||
|     >r dup length [ 1- ] keep r> |  | ||||||
|     [ ^ 0 swap 2array ] keep |  | ||||||
|     0 <array> <p-list> ; |  | ||||||
| 
 |  | ||||||
| : inc-seq ( seq max -- ) |  | ||||||
|     2dup [ < ] curry find-last over [ |  | ||||||
|         nipd 1+ 2over swap set-nth |  | ||||||
|         1+ over length rot <slice> reset-array |  | ||||||
|     ] [ |  | ||||||
|         3drop reset-array |  | ||||||
|     ] if ; |  | ||||||
| 
 |  | ||||||
| : inc-count ( tuple -- ) |  | ||||||
|     [ p-list-count first2 >r 1+ r> 2array ] keep |  | ||||||
|     set-p-list-count ; |  | ||||||
| 
 |  | ||||||
| : (get-permutation) ( seq index-seq -- newseq ) |  | ||||||
|     [ swap nth ] map-with ; |  | ||||||
| 
 |  | ||||||
| : get-permutation ( tuple -- seq ) |  | ||||||
|     [ p-list-seq ] keep p-list-count-vec (get-permutation) ; |  | ||||||
| 
 |  | ||||||
| : p-list-next ( tuple -- seq/f ) |  | ||||||
|     dup p-list-count first2 < [ |  | ||||||
|         [ |  | ||||||
|             [ get-permutation ] keep |  | ||||||
|             [ p-list-count-vec ] keep p-list-max |  | ||||||
|             inc-seq |  | ||||||
|         ] keep inc-count |  | ||||||
|     ] [ |  | ||||||
|         drop f |  | ||||||
|     ] if ; |  | ||||||
| 
 |  | ||||||
| : (permutations) ( tuple -- ) |  | ||||||
|     dup p-list-next [ , (permutations) ] [ drop ] if* ; |  | ||||||
| 
 |  | ||||||
| : permutations ( seq n -- seq ) |  | ||||||
|     make-p-list [ (permutations) ] { } make ; |  | ||||||
| 
 |  | ||||||
| : (each-permutation) ( tuple quot -- ) |  | ||||||
|     over p-list-next [ |  | ||||||
|         [ rot drop swap call ] 3keep |  | ||||||
|         drop (each-permutation) |  | ||||||
|     ] [ |  | ||||||
|         2drop |  | ||||||
|     ] if* ; inline |  | ||||||
| 
 |  | ||||||
| : each-permutation ( seq n quot -- ) |  | ||||||
|     >r make-p-list r> (each-permutation) ; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| : builder-permutations ( n -- seq ) |  | ||||||
|     { [ compose ] [ swap curry ] } swap permutations |  | ||||||
|     [ concat ] map ; foldable |  | ||||||
| 
 |  | ||||||
| : all-quot-permutations ( seq -- newseq ) |  | ||||||
|     dup length 1- builder-permutations |  | ||||||
|     swap [ 1quotation ] map dup length permutations |  | ||||||
|     [ swap [ >r seq>stack r> call ] curry* map ] curry* map ; |  | ||||||
| 
 |  | ||||||
| ! clear { map sq 10 } all-quot-permutations [ [ [ [ [ call ] keep datastack length 2 = [ . .s nl ] when ] catch ] in-thread drop ] each ] each |  | ||||||
| ! clear { map sq sq 10 } all-quot-permutations [ [ [ [ [ call ] keep datastack length 2 = [ . .s nl ] when ] catch ] in-thread drop ] each ] each |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue