-USING: io io.files io.streams.duplex kernel sequences
-sequences.private strings vectors words memoize splitting
-grouping hints unicode.case continuations io.encodings.ascii ;
+! Copyright (C) 2006, 2008 Slava Pestov.
+! See https://factorcode.org/license.txt for BSD license.
+USING: ascii grouping hints io io.encodings.ascii io.files
+io.files.temp kernel sequences strings tr vectors ;
IN: benchmark.reverse-complement
-MEMO: trans-map ( -- str )
- 256 >string
- "TGCAAKYRMBDHV" "ACGTUMRYKVHDB"
- [ pick set-nth ] 2each ;
-
-: do-trans-map ( str -- )
- [ ch>upper trans-map nth ] change-each ;
-
-HINTS: do-trans-map string ;
+TR: trans-map ch>upper "ACGTUMRYKVHDB" "TGCAAKYRMBDHV" ;
: translate-seq ( seq -- str )
- concat dup reverse-here dup do-trans-map ;
+ concat reverse! dup trans-map-fast ;
: show-seq ( seq -- )
- translate-seq 60 <groups> [ print ] each ;
+ translate-seq 60 group [ print ] each ;
: do-line ( seq line -- seq )
- dup first ">;" memq? [
- over show-seq print dup delete-all
- ] [
- over push
- ] if ;
+ dup first ">;" member-eq?
+ [ over show-seq print dup delete-all ] [ suffix! ] if ;
HINTS: do-line vector string ;
-: (reverse-complement) ( seq -- )
- readln [ do-line (reverse-complement) ] [ show-seq ] if* ;
-
: reverse-complement ( infile outfile -- )
ascii [
ascii [
- 500000 <vector> (reverse-complement)
+ 500,000 <vector>
+ [ do-line ] each-line
+ show-seq
] with-file-reader
] with-file-writer ;
: reverse-complement-out ( -- path )
"reverse-complement-out.txt" temp-file ;
-: reverse-complement-main ( -- )
+: reverse-complement-benchmark ( -- )
reverse-complement-in
reverse-complement-out
reverse-complement ;
-MAIN: reverse-complement-main
+MAIN: reverse-complement-benchmark