{-# LANGUAGE CPP #-}
module Data.Set.Extra
( module Set
, mapM
, mapM_
, filterM
, catMaybes
, mapMaybe
, flatten
, concatMap
, concatMapM
, any
, all
, or
, and
, ss
, toSS
, fromSS
, ssMapM
, distrib
, cartesianProduct
, groupBy
, powerset
, partitionM
, unzip
, gFind
) where
import qualified Control.Monad as List (mapM, mapM_, filterM, foldM)
import Control.Monad.State ()
import qualified Data.Foldable as Foldable (all, any, and, or)
import Data.Map as Map (Map, insertWith, empty)
import Data.Set as Set
import Data.Set.ExtraG
import qualified Data.List as List
import Prelude hiding (mapM, mapM_, unzip, all, any, map, filter, null, concatMap, and, or)
mapM :: (Monad m, Ord b) => (a -> m b) -> Set a -> m (Set b)
mapM :: (a -> m b) -> Set a -> m (Set b)
mapM f :: a -> m b
f s :: Set a
s = (a -> m b) -> [a] -> m [b]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
List.mapM a -> m b
f (Set a -> [a]
forall a. Set a -> [a]
toList Set a
s) m [b] -> ([b] -> m (Set b)) -> m (Set b)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Set b -> m (Set b)
forall (m :: * -> *) a. Monad m => a -> m a
return (Set b -> m (Set b)) -> ([b] -> Set b) -> [b] -> m (Set b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> Set b
forall a. Ord a => [a] -> Set a
fromList
mapM_ :: (Monad m, Ord b) => (a -> m b) -> Set a -> m ()
mapM_ :: (a -> m b) -> Set a -> m ()
mapM_ f :: a -> m b
f s :: Set a
s = (a -> m b) -> [a] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
List.mapM_ a -> m b
f (Set a -> [a]
forall a. Set a -> [a]
toList Set a
s)
filterM :: (Ord a, Monad m) => (a -> m Bool) -> Set a -> m (Set a)
filterM :: (a -> m Bool) -> Set a -> m (Set a)
filterM p :: a -> m Bool
p s :: Set a
s = (a -> m Bool) -> [a] -> m [a]
forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
List.filterM a -> m Bool
p (Set a -> [a]
forall a. Set a -> [a]
toList Set a
s) m [a] -> ([a] -> m (Set a)) -> m (Set a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Set a -> m (Set a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Set a -> m (Set a)) -> ([a] -> Set a) -> [a] -> m (Set a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Set a
forall a. Ord a => [a] -> Set a
fromList
catMaybes :: Ord a => Set (Maybe a) -> Set a
catMaybes :: Set (Maybe a) -> Set a
catMaybes sm :: Set (Maybe a)
sm = (Maybe a -> Set a -> Set a) -> Set a -> Set (Maybe a) -> Set a
forall a b. (a -> b -> b) -> b -> Set a -> b
fold (\ mx :: Maybe a
mx s :: Set a
s -> Set a -> (a -> Set a) -> Maybe a -> Set a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Set a
s (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
`insert` Set a
s) Maybe a
mx) Set a
forall a. Set a
Set.empty Set (Maybe a)
sm
mapMaybe :: (Ord a, Ord b) => (a -> Maybe b) -> Set a -> Set b
mapMaybe :: (a -> Maybe b) -> Set a -> Set b
mapMaybe f :: a -> Maybe b
f s :: Set a
s = Set (Maybe b) -> Set b
forall a. Ord a => Set (Maybe a) -> Set a
catMaybes ((a -> Maybe b) -> Set a -> Set (Maybe b)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map a -> Maybe b
f Set a
s)
flatten :: Ord a => Set (Set a) -> Set a
flatten :: Set (Set a) -> Set a
flatten ss' :: Set (Set a)
ss' = (Set a -> Set a -> Set a) -> Set a -> Set (Set a) -> Set a
forall a b. (a -> b -> b) -> b -> Set a -> b
fold Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
union Set a
forall a. Set a
Set.empty Set (Set a)
ss'
concatMap :: (Ord a, Ord b) => (a -> Set b) -> Set a -> Set b
concatMap :: (a -> Set b) -> Set a -> Set b
concatMap f :: a -> Set b
f s :: Set a
s = Set (Set b) -> Set b
forall a. Ord a => Set (Set a) -> Set a
flatten ((a -> Set b) -> Set a -> Set (Set b)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map a -> Set b
f Set a
s)
concatMapM :: (Monad m, Ord a, Ord b) => (a -> m (Set b)) -> Set a -> m (Set b)
concatMapM :: (a -> m (Set b)) -> Set a -> m (Set b)
concatMapM f :: a -> m (Set b)
f s :: Set a
s = (a -> m (Set b)) -> Set a -> m (Set (Set b))
forall (m :: * -> *) b a.
(Monad m, Ord b) =>
(a -> m b) -> Set a -> m (Set b)
mapM a -> m (Set b)
f Set a
s m (Set (Set b)) -> (Set (Set b) -> m (Set b)) -> m (Set b)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Set b -> m (Set b)
forall (m :: * -> *) a. Monad m => a -> m a
return (Set b -> m (Set b))
-> (Set (Set b) -> Set b) -> Set (Set b) -> m (Set b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set (Set b) -> Set b
forall a. Ord a => Set (Set a) -> Set a
flatten
any :: Ord a => (a -> Bool) -> Set a -> Bool
any :: (a -> Bool) -> Set a -> Bool
any = (a -> Bool) -> Set a -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
Foldable.any
all :: Ord a => (a -> Bool) -> Set a -> Bool
all :: (a -> Bool) -> Set a -> Bool
all = (a -> Bool) -> Set a -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
Foldable.all
or :: Set Bool -> Bool
or :: Set Bool -> Bool
or = Set Bool -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
Foldable.or
and :: Set Bool -> Bool
and :: Set Bool -> Bool
and = Set Bool -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
Foldable.and
ss :: Ord a => a -> Set (Set a)
ss :: a -> Set (Set a)
ss = Set a -> Set (Set a)
forall a. a -> Set a
singleton (Set a -> Set (Set a)) -> (a -> Set a) -> a -> Set (Set a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Set a
forall a. a -> Set a
singleton
toSS :: Ord a => [[a]] -> Set (Set a)
toSS :: [[a]] -> Set (Set a)
toSS = [Set a] -> Set (Set a)
forall a. Ord a => [a] -> Set a
fromList ([Set a] -> Set (Set a))
-> ([[a]] -> [Set a]) -> [[a]] -> Set (Set a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a] -> Set a) -> [[a]] -> [Set a]
forall a b. (a -> b) -> [a] -> [b]
List.map [a] -> Set a
forall a. Ord a => [a] -> Set a
fromList
fromSS :: Ord a => Set (Set a) -> [[a]]
fromSS :: Set (Set a) -> [[a]]
fromSS = (Set a -> [a]) -> [Set a] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
List.map Set a -> [a]
forall a. Set a -> [a]
toList ([Set a] -> [[a]])
-> (Set (Set a) -> [Set a]) -> Set (Set a) -> [[a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set (Set a) -> [Set a]
forall a. Set a -> [a]
toList
ssMapM :: (Monad m, Ord a, Ord b) => (a -> m b) -> Set (Set a) -> m (Set (Set b))
ssMapM :: (a -> m b) -> Set (Set a) -> m (Set (Set b))
ssMapM f :: a -> m b
f s :: Set (Set a)
s = ([a] -> m [b]) -> [[a]] -> m [[b]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
List.mapM ((a -> m b) -> [a] -> m [b]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
List.mapM a -> m b
f) (Set (Set a) -> [[a]]
forall a. Ord a => Set (Set a) -> [[a]]
fromSS Set (Set a)
s) m [[b]] -> ([[b]] -> m (Set (Set b))) -> m (Set (Set b))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Set (Set b) -> m (Set (Set b))
forall (m :: * -> *) a. Monad m => a -> m a
return (Set (Set b) -> m (Set (Set b)))
-> ([[b]] -> Set (Set b)) -> [[b]] -> m (Set (Set b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[b]] -> Set (Set b)
forall a. Ord a => [[a]] -> Set (Set a)
toSS
distrib :: Ord a => Set (Set a) -> Set (Set a) -> Set (Set a)
distrib :: Set (Set a) -> Set (Set a) -> Set (Set a)
distrib lss :: Set (Set a)
lss rss :: Set (Set a)
rss = Set (Set (Set a)) -> Set (Set a)
forall a. Ord a => Set (Set a) -> Set a
flatten (Set (Set (Set a)) -> Set (Set a))
-> Set (Set (Set a)) -> Set (Set a)
forall a b. (a -> b) -> a -> b
$ (Set a -> Set (Set a)) -> Set (Set a) -> Set (Set (Set a))
forall b a. Ord b => (a -> b) -> Set a -> Set b
map (\ rs :: Set a
rs -> ((Set a -> Set a) -> Set (Set a) -> Set (Set a)
forall b a. Ord b => (a -> b) -> Set a -> Set b
map (\ ls :: Set a
ls -> Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
union Set a
rs Set a
ls) Set (Set a)
lss)) Set (Set a)
rss
#if !MIN_VERSION_containers(0,5,11)
cartesianProduct :: (Ord a, Ord b) => Set a -> Set b -> Set (a, b)
cartesianProduct xs ys = flatten $ Set.map (\ x -> Set.map (\ y -> (x, y)) ys) xs
#endif
groupBy :: (Ord a, Ord b) => (a -> b) -> Set a -> Map.Map b (Set a)
groupBy :: (a -> b) -> Set a -> Map b (Set a)
groupBy f :: a -> b
f xs :: Set a
xs = (a -> Map b (Set a) -> Map b (Set a))
-> Map b (Set a) -> Set a -> Map b (Set a)
forall a b. (a -> b -> b) -> b -> Set a -> b
fold (\ x :: a
x m :: Map b (Set a)
m -> (Set a -> Set a -> Set a)
-> b -> Set a -> Map b (Set a) -> Map b (Set a)
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
union (a -> b
f a
x) (a -> Set a
forall a. a -> Set a
singleton a
x) Map b (Set a)
m) Map b (Set a)
forall k a. Map k a
Map.empty Set a
xs
powerset :: Ord a => Set a -> Set (Set a)
powerset :: Set a -> Set (Set a)
powerset s :: Set a
s
| Set a
s Set a -> Set a -> Bool
forall a. Eq a => a -> a -> Bool
== Set a
forall a. Set a
Set.empty = Set a -> Set (Set a)
forall a. a -> Set a
singleton Set a
forall a. Set a
Set.empty
| Bool
otherwise = (Set a -> Set a) -> Set (Set a) -> Set (Set a)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
insert a
x) Set (Set a)
pxs Set (Set a) -> Set (Set a) -> Set (Set a)
forall a. Ord a => Set a -> Set a -> Set a
`union` Set (Set a)
pxs
where (x :: a
x, xs :: Set a
xs) = Set a -> (a, Set a)
forall a. Set a -> (a, Set a)
deleteFindMin Set a
s
pxs :: Set (Set a)
pxs = Set a -> Set (Set a)
forall a. Ord a => Set a -> Set (Set a)
powerset Set a
xs
partitionM :: (Monad m, Ord a) => (a -> m Bool) -> Set a -> m (Set a, Set a)
partitionM :: (a -> m Bool) -> Set a -> m (Set a, Set a)
partitionM p :: a -> m Bool
p xs :: Set a
xs =
((Set a, Set a) -> a -> m (Set a, Set a))
-> (Set a, Set a) -> [a] -> m (Set a, Set a)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
List.foldM (Set a, Set a) -> a -> m (Set a, Set a)
f (Set a
forall a. Set a
Set.empty, Set a
forall a. Set a
Set.empty) (Set a -> [a]
forall a. Set a -> [a]
toList Set a
xs)
where f :: (Set a, Set a) -> a -> m (Set a, Set a)
f (ts :: Set a
ts, fs :: Set a
fs) x :: a
x = a -> m Bool
p a
x m Bool -> (Bool -> m (Set a, Set a)) -> m (Set a, Set a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ flag :: Bool
flag -> (Set a, Set a) -> m (Set a, Set a)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Set a, Set a) -> m (Set a, Set a))
-> (Set a, Set a) -> m (Set a, Set a)
forall a b. (a -> b) -> a -> b
$ if Bool
flag then (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
insert a
x Set a
ts, Set a
fs) else (Set a
ts, a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
insert a
x Set a
fs)
unzip :: (Ord a, Ord b) => Set (a, b) -> (Set a, Set b)
unzip :: Set (a, b) -> (Set a, Set b)
unzip s :: Set (a, b)
s = ((a, b) -> (Set a, Set b) -> (Set a, Set b))
-> (Set a, Set b) -> Set (a, b) -> (Set a, Set b)
forall a b. (a -> b -> b) -> b -> Set a -> b
Set.fold (\ (l :: a
l, r :: b
r) (ls :: Set a
ls, rs :: Set b
rs) -> (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.insert a
l Set a
ls, b -> Set b -> Set b
forall a. Ord a => a -> Set a -> Set a
Set.insert b
r Set b
rs)) (Set a
forall a. Set a
Set.empty, Set b
forall a. Set a
Set.empty) Set (a, b)
s