diff --git a/core/sets/sets-docs.factor b/core/sets/sets-docs.factor index 57d62f6480..b3fa649dd1 100644 --- a/core/sets/sets-docs.factor +++ b/core/sets/sets-docs.factor @@ -8,6 +8,7 @@ $nl { $subsection prune } "Test for duplicates:" { $subsection all-unique? } +{ $subsection duplicates } "Set operations on sequences:" { $subsection diff } { $subsection intersect } @@ -64,6 +65,13 @@ HELP: prune { $example "USING: sets prettyprint ;" "{ 1 1 t 3 t } prune ." "V{ 1 t 3 }" } } ; +HELP: duplicates +{ $values { "seq" "a sequence" } { "newseq" "a sequence" } } +{ $description "Outputs a new sequence consisting of elements which occur more than once in " { $snippet "seq" } "." } +{ $examples + { $example "USING: sets prettyprint ;" "{ 1 2 3 1 2 1 } duplicates ." "{ 1 2 1 }" } +} ; + HELP: all-unique? { $values { "seq" sequence } { "?" "a boolean" } } { $description "Tests whether a sequence contains any repeated elements." } diff --git a/core/sets/sets.factor b/core/sets/sets.factor index d825faf921..c411bfcdcd 100644 --- a/core/sets/sets.factor +++ b/core/sets/sets.factor @@ -16,6 +16,9 @@ IN: sets [ ] [ length ] [ length ] tri [ [ (prune) ] 2curry each ] keep ; +: duplicates ( seq -- newseq ) + H{ } clone [ [ key? ] [ conjoin ] 2bi ] curry filter ; + : gather ( seq quot -- newseq ) map concat prune ; inline