Skip to content

Commit 0efa4f1

Browse files
authored
Add toggle for Set (#49)
1 parent f226bdf commit 0efa4f1

File tree

3 files changed

+13
-1
lines changed

3 files changed

+13
-1
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+
- Added `toggle` for `Set`
1011

1112
Bugfixes:
1213

src/Data/Set.purs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module Data.Set
1515
, insert
1616
, member
1717
, delete
18+
, toggle
1819
, size
1920
, findMin
2021
, findMax
@@ -44,7 +45,7 @@ import Data.Foldable (class Foldable, foldMap, foldl, foldr)
4445
import Data.List (List)
4546
import Data.List as List
4647
import Data.Map.Internal as M
47-
import Data.Maybe (Maybe, maybe)
48+
import Data.Maybe (Maybe(..), maybe)
4849
import Data.Ord (class Ord1)
4950
import Data.Unfoldable (class Unfoldable)
5051
import Partial.Unsafe (unsafePartial)
@@ -128,6 +129,10 @@ insert a (Set m) = Set (M.insert a unit m)
128129
delete :: forall a. Ord a => a -> Set a -> Set a
129130
delete a (Set m) = Set (a `M.delete` m)
130131

132+
-- | Insert a value into a set if it is not already present, if it is present, delete it.
133+
toggle :: forall a. Ord a => a -> Set a -> Set a
134+
toggle a (Set m) = Set (M.alter (maybe (Just unit) (\_ -> Nothing)) a m)
135+
131136
-- | Find the size of a set
132137
size :: forall a. Set a -> Int
133138
size (Set m) = M.size m

test/Test/Data/Set.purs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ setTests = do
3131
do let s1 = S.fromFoldable [Just 1,Just 2,Just 3,Nothing]
3232
s2 = S.fromFoldable [1,2,3]
3333
assert $ S.catMaybes s1 == s2
34+
35+
log "toggle - inserts item"
36+
assert $ S.toggle 1 S.empty == S.fromFoldable [1]
37+
38+
log "toggle - deletes item"
39+
assert $ S.toggle 1 (S.fromFoldable [1]) == S.empty

0 commit comments

Comments
 (0)