2010-02-26 11:01:57 -05:00
|
|
|
! Copyright (C) 2010 Daniel Ehrenberg
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2010-02-26 16:01:01 -05:00
|
|
|
USING: accessors assocs hashtables kernel sets
|
2010-02-26 11:01:57 -05:00
|
|
|
sequences parser ;
|
2011-09-06 14:26:29 -04:00
|
|
|
|
2010-02-26 11:01:57 -05:00
|
|
|
IN: hash-sets
|
|
|
|
|
|
|
|
! In a better implementation, less memory would be used
|
|
|
|
TUPLE: hash-set { table hashtable read-only } ;
|
|
|
|
|
2011-10-19 14:35:25 -04:00
|
|
|
: <hash-set> ( capacity -- hash-set )
|
|
|
|
<hashtable> hash-set boa ; inline
|
|
|
|
|
|
|
|
: >hash-set ( members -- hash-set )
|
2011-09-03 19:38:42 -04:00
|
|
|
unique hash-set boa ; inline
|
2010-02-26 11:01:57 -05:00
|
|
|
|
|
|
|
INSTANCE: hash-set set
|
|
|
|
M: hash-set in? table>> key? ; inline
|
|
|
|
M: hash-set adjoin table>> dupd set-at ; inline
|
|
|
|
M: hash-set delete table>> delete-at ; inline
|
|
|
|
M: hash-set members table>> keys ; inline
|
2011-10-19 14:35:25 -04:00
|
|
|
M: hash-set set-like drop dup hash-set? [ members >hash-set ] unless ;
|
2010-04-13 07:43:29 -04:00
|
|
|
M: hash-set clone table>> clone hash-set boa ;
|
2010-04-17 17:25:51 -04:00
|
|
|
M: hash-set null? table>> assoc-empty? ;
|
2010-12-27 22:22:36 -05:00
|
|
|
M: hash-set cardinality table>> assoc-size ;
|
2010-02-26 11:01:57 -05:00
|
|
|
|
2011-10-19 14:35:25 -04:00
|
|
|
M: sequence fast-set >hash-set ;
|
2010-02-26 13:24:26 -05:00
|
|
|
M: f fast-set drop H{ } clone hash-set boa ;
|
2010-02-26 12:07:37 -05:00
|
|
|
|
|
|
|
M: sequence duplicates
|
2010-03-16 20:17:26 -04:00
|
|
|
f fast-set [ [ in? ] [ adjoin ] 2bi ] curry filter ;
|
2010-04-13 07:43:29 -04:00
|
|
|
|
|
|
|
<PRIVATE
|
|
|
|
|
|
|
|
: (all-unique?) ( elt hash -- ? )
|
|
|
|
2dup in? [ 2drop f ] [ adjoin t ] if ; inline
|
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
|
|
|
M: sequence all-unique?
|
2011-10-19 14:35:25 -04:00
|
|
|
dup length <hash-set> [ (all-unique?) ] curry all? ;
|