1 ! Copyright (C) 2008 Chris Double & James Cash
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel sequences accessors math ;
9 GENERIC: car ( cons -- car )
10 GENERIC: cdr ( cons -- cdr )
11 GENERIC: nil? ( cons -- ? )
17 M: cons car ( cons -- car )
20 M: cons cdr ( cons -- cdr )
26 M: cons nil? ( cons -- bool )
29 : 1list ( obj -- cons )
32 : 2list ( a b -- cons )
35 : 3list ( a b c -- cons )
38 : 2car ( cons -- car caar )
39 [ car ] [ cdr car ] bi ;
41 : 3car ( cons -- car caar caaar )
42 [ car ] [ cdr car ] [ cdr cdr car ] tri ;
44 : uncons ( cons -- cdr car )
47 : lnth ( n list -- elt )
48 swap [ cdr ] times car ;
50 : (llength) ( list acc -- n )
51 over nil? [ nip ] [ [ cdr ] dip 1+ (llength) ] if ;
53 : llength ( list -- n )
56 : leach ( list quot -- )
57 over nil? [ 2drop ] [ [ uncons ] dip tuck call leach ] if ; inline
59 : lreduce ( list identity quot -- result )
62 : seq>cons ( seq -- cons )
63 <reversed> nil [ f cons swap >>cdr ] reduce ;
65 : (lmap) ( acc cons quot -- seq )
67 [ [ uncons ] dip [ call ] keep swapd [ suffix ] 2dip (map-cons) ] if ; inline
69 : lmap ( cons quot -- seq )
70 [ { } clone ] 2dip (map-cons) ; inline
72 : cons>seq ( cons -- array )