2008-06-02 01:26:10 -04:00
|
|
|
! Copyright (C) 2008 James Cash
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: kernel sequences accessors ;
|
|
|
|
|
2008-06-03 01:27:06 -04:00
|
|
|
IN: lists
|
2008-06-02 01:26:10 -04:00
|
|
|
|
2008-06-03 03:38:56 -04:00
|
|
|
! Lazy List Protocol
|
|
|
|
MIXIN: list
|
|
|
|
GENERIC: car ( cons -- car )
|
|
|
|
GENERIC: cdr ( cons -- cdr )
|
|
|
|
GENERIC: nil? ( cons -- ? )
|
|
|
|
|
2008-06-02 01:26:10 -04:00
|
|
|
TUPLE: cons car cdr ;
|
|
|
|
|
2008-06-03 03:38:56 -04:00
|
|
|
C: cons cons
|
|
|
|
|
|
|
|
M: cons car ( cons -- car )
|
|
|
|
car>> ;
|
|
|
|
|
|
|
|
M: cons cdr ( cons -- cdr )
|
|
|
|
cdr>> ;
|
|
|
|
|
|
|
|
: nil ( -- cons )
|
|
|
|
T{ cons f f f } ;
|
2008-06-02 01:26:10 -04:00
|
|
|
|
2008-06-03 03:38:56 -04:00
|
|
|
M: cons nil? ( cons -- bool )
|
|
|
|
nil eq? ;
|
|
|
|
|
|
|
|
: 1list ( obj -- cons )
|
|
|
|
nil cons ;
|
|
|
|
|
|
|
|
: 2list ( a b -- cons )
|
|
|
|
nil cons cons ;
|
|
|
|
|
|
|
|
: 3list ( a b c -- cons )
|
|
|
|
nil cons cons cons ;
|
|
|
|
|
|
|
|
: uncons ( cons -- cdr car )
|
|
|
|
[ cdr ] [ car ] bi ;
|
2008-06-02 01:26:10 -04:00
|
|
|
|
|
|
|
: seq>cons ( seq -- cons )
|
2008-06-03 03:38:56 -04:00
|
|
|
<reversed> nil [ f cons swap >>cdr ] reduce ;
|
2008-06-02 01:26:10 -04:00
|
|
|
|
|
|
|
: (map-cons) ( acc cons quot -- seq )
|
2008-06-03 03:38:56 -04:00
|
|
|
over nil? [ 2drop ]
|
2008-06-02 14:13:48 -04:00
|
|
|
[ [ uncons ] dip [ call ] keep swapd [ suffix ] 2dip (map-cons) ] if ;
|
2008-06-02 01:26:10 -04:00
|
|
|
|
|
|
|
: map-cons ( cons quot -- seq )
|
2008-06-02 14:13:48 -04:00
|
|
|
[ { } clone ] 2dip (map-cons) ;
|
|
|
|
|
2008-06-03 01:27:06 -04:00
|
|
|
: cons>seq ( cons -- array )
|
|
|
|
[ ] map-cons ;
|
|
|
|
|
2008-06-02 14:13:48 -04:00
|
|
|
: reduce-cons ( cons identity quot -- result )
|
2008-06-03 03:38:56 -04:00
|
|
|
pick nil? [ drop nip ]
|
|
|
|
[ [ uncons ] 2dip swapd [ call ] keep reduce-cons ] if ;
|
|
|
|
|
|
|
|
INSTANCE: cons list
|