--- /dev/null
+! Copyright (C) 2008 Jeff Bigot
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel arrays sequences fry math combinators ;
+
+IN: adsoda.combinators
+
+! : (combinations) ( seq -- seq ) [ 1 tail ] dip combinations ;
+
+! : prefix-each [ prefix ] curry map ; inline
+
+! : combinations ( seq n -- seqs )
+! {
+! { [ dup 0 = ] [ 2drop { { } } ] }
+! { [ over empty? ] [ 2drop { } ] }
+! { [ t ] [
+! [ [ 1 - (combinations) ] [ drop first ] 2bi prefix-each ]
+! [ (combinations) ] 2bi append
+! ] }
+! } cond ;
+
+: columnize ( array -- array ) [ 1array ] map ; inline
+
+: among ( array n -- array )
+ 2dup swap length
+ {
+ { [ over 1 = ] [ 3drop columnize ] }
+ { [ over 0 = ] [ 4drop { } ] }
+ { [ 2dup < ] [ 2drop [ 1 cut ] dip
+ [ 1 - among [ append ] with map ]
+ [ among append ] 2bi
+ ] }
+ { [ 2dup = ] [ 3drop 1array ] }
+ { [ 2dup > ] [ 4drop { } ] }
+ } cond
+;
+
+: concat-nth ( seq1 seq2 -- seq )
+ [ nth append ] curry map-index ;
+
+: do-cycle ( array -- array ) dup first suffix ;
+
+: map-but ( seq i quot -- seq )
+ ! quot : ( seq x -- seq )
+ '[ _ = [ @ ] unless ] map-index ; inline
+