Skip to content

Commit 92a7c20

Browse files
authored
Add set limit to range operation using submap (#75)
1 parent 45d1e4f commit 92a7c20

File tree

3 files changed

+12
-0
lines changed

3 files changed

+12
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Notable changes to this project are documented in this file. The format is based
77
Breaking changes:
88

99
New features:
10+
- Add `Data.Set.range` which works like `Data.Map.submap`.
1011

1112
Bugfixes:
1213

src/Data/Set.purs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module Data.Set
1818
, size
1919
, findMin
2020
, findMax
21+
, range
2122
, union
2223
, unions
2324
, difference
@@ -136,6 +137,11 @@ findMin (Set m) = Prelude.map _.key (M.findMin m)
136137
findMax :: forall a. Set a -> Maybe a
137138
findMax (Set m) = Prelude.map _.key (M.findMax m)
138139

140+
-- | Return the set limited to the lower and upper bounds (including keys equal
141+
-- | to those bounds).
142+
range :: forall a. Ord a => Maybe a -> Maybe a -> Set a -> Set a
143+
range kmin kmax (Set m) = Set (M.submap kmin kmax m)
144+
139145
-- | Form the union of two sets
140146
-- |
141147
-- | Running time: `O(n + m)`

test/Test/Data/Set.purs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,8 @@ setTests = do
3737

3838
log "toggle - deletes item"
3939
assert $ S.toggle 1 (S.fromFoldable [1]) == S.empty
40+
41+
log "range"
42+
do let s1 = S.fromFoldable [1,2,3,4,5]
43+
s2 = S.fromFoldable [2,3]
44+
assert $ S.range (Just 2) (Just 3) s1 == s2

0 commit comments

Comments
 (0)