]> gitweb.factorcode.org Git - factor.git/blob - extra/lists/lists.factor
4b8cc776589bd311d1dd1796c8e9e9d7a0310171
[factor.git] / extra / lists / lists.factor
1 ! Copyright (C) 2008 James Cash
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel sequences accessors ;
4
5 IN: lists
6
7 ! Lazy List Protocol
8 MIXIN: list
9 GENERIC: car   ( cons -- car )
10 GENERIC: cdr   ( cons -- cdr )
11 GENERIC: nil?  ( cons -- ? )
12
13 TUPLE: cons car cdr ;
14
15 C: cons cons
16
17 M: cons car ( cons -- car )
18     car>> ;
19
20 M: cons cdr ( cons -- cdr )
21     cdr>> ;
22
23 : nil ( -- cons )
24   T{ cons f f f } ;
25
26 M: cons nil? ( cons -- bool )
27     nil eq? ;
28
29 : 1list ( obj -- cons )
30     nil cons ;
31
32 : 2list ( a b -- cons )
33     nil cons cons ;
34
35 : 3list ( a b c -- cons )
36     nil cons cons cons ;
37     
38 : uncons ( cons -- cdr car )
39     [ cdr ] [ car ] bi ;
40
41 : seq>cons ( seq -- cons )
42     <reversed> nil [ f cons swap >>cdr ] reduce ;
43     
44 : (map-cons) ( acc cons quot -- seq )    
45     over nil? [ 2drop ]
46     [ [ uncons ] dip [ call ] keep swapd [ suffix ] 2dip (map-cons) ] if ;
47     
48 : map-cons ( cons quot -- seq )
49     [ { } clone ] 2dip (map-cons) ;
50     
51 : cons>seq ( cons -- array )    
52     [ ] map-cons ;
53     
54 : reduce-cons ( cons identity quot -- result )    
55     pick nil? [ drop nip ]
56     [ [ uncons ] 2dip swapd [ call ] keep reduce-cons ] if ;
57     
58 INSTANCE: cons list