{-|
Module : Set
Description : Work with sets.
License : BSD 3
Maintainer : terezasokol@gmail.com
Stability : experimental
Portability : POSIX
-}
module Set
( Set
-- * Build
, empty, singleton, insert, remove
-- * Query
, isEmpty, member, size
-- * Combine
, union, intersect, diff
-- * Lists
, toList, fromList
-- * Transform
, map, foldl, foldr, filter, partition
)
where
import Basics ((>>), Bool, Int)
import List (List)
import qualified Data.Set
import qualified Prelude
{-| Represents a set of unique values. So `(Set Int)` is a set of integers and
`(Set String)` is a set of strings.
-}
type Set t =
Data.Set.Set t
{-| Create an empty set.
-}
empty :: Set a
empty =
Data.Set.empty
{-| Create a set with one value.
-}
singleton :: comparable -> Set comparable
singleton =
Data.Set.singleton
{-| Insert a value into a set.
-}
insert :: Prelude.Ord comparable => comparable -> Set comparable -> Set comparable
insert =
Data.Set.insert
{-| Remove a value from a set. If the value is not found, no changes are made.
-}
remove :: Prelude.Ord comparable => comparable -> Set comparable -> Set comparable
remove =
Data.Set.delete
{-| Determine if a set is empty.
-}
isEmpty :: Set a -> Bool
isEmpty =
Data.Set.null
{-| Determine if a value is in a set.
-}
member :: Prelude.Ord comparable => comparable -> Set comparable -> Bool
member =
Data.Set.member
{-| Determine the number of elements in a set.
-}
size :: Set a -> Int
size =
Data.Set.size >> Prelude.fromIntegral
{-| Get the union of two sets. Keep all values.
-}
union :: Prelude.Ord comparable => Set comparable -> Set comparable -> Set comparable
union =
Data.Set.union
{-| Get the intersection of two sets. Keeps values that appear in both sets.
-}
intersect :: Prelude.Ord comparable => Set comparable -> Set comparable -> Set comparable
intersect =
Data.Set.intersection
{-| Get the difference between the first set and the second. Keeps values
that do not appear in the second set.
-}
diff :: Prelude.Ord comparable => Set comparable -> Set comparable -> Set comparable
diff =
Data.Set.difference
{-| Convert a set into a list, sorted from lowest to highest.
-}
toList :: Set a -> List a
toList =
Data.Set.toAscList
{-| Convert a list into a set, removing any duplicates.
-}
fromList :: Prelude.Ord comparable => List comparable -> Set comparable
fromList =
Data.Set.fromList
{-| Fold over the values in a set, in order from lowest to highest.
-}
foldl :: (a -> b -> b) -> b -> Set a -> b
foldl func =
Data.Set.foldl' (Prelude.flip func)
{-| Fold over the values in a set, in order from highest to lowest.
-}
foldr :: (a -> b -> b) -> b -> Set a -> b
foldr =
Data.Set.foldr'
{-| Map a function onto a set, creating a new set with no duplicates.
-}
map :: Prelude.Ord comparable2 => (comparable -> comparable2) -> Set comparable -> Set comparable2
map =
Data.Set.map
{-| Only keep elements that pass the given test.
> import Set exposing (Set)
>
> numbers :: Set Int
> numbers =
> Set.fromList [-2,-1,0,1,2]
>
> positives :: Set Int
> positives =
> Set.filter (\x -> x > 0) numbers
>
> -- positives == Set.fromList [1,2]
-}
filter :: (comparable -> Bool) -> Set comparable -> Set comparable
filter =
Data.Set.filter
{-| Create two new sets. The first contains all the elements that passed the
given test, and the second contains all the elements that did not.
-}
partition :: (comparable -> Bool) -> Set comparable -> (Set comparable, Set comparable)
partition =
Data.Set.partition