2 import qualified Data
.List
as List
3 import Data
.Maybe (fromJust)
5 import qualified Data
.Set
as Set
6 import Data
.Tuple
(swap
)
8 subsetsOfSize
:: Ord a
=> Integer -> Set a
-> Set
(Set a
)
9 subsetsOfSize n xs
= case compare n
0 of
11 EQ
-> Set
.singleton Set
.empty
12 GT
-> case Set
.minView xs
of
14 Just
(x
, xs
') -> Set
.union
15 (subsetsOfSize n xs
') $
16 Set
.map (Set
.insert x
) $ subsetsOfSize
(n
- 1) xs
'
18 distinctPairsOneWay
:: Ord a
=> Set a
-> Set
(a
, a
)
20 Set
.map (\xys
-> let [x
, y
] = Set
.toList xys
in (x
, y
)) . subsetsOfSize
2
22 distinctPairs
:: Ord a
=> Set a
-> Set
(a
, a
)
24 let dpow
= distinctPairsOneWay xs
in
25 Set
.union dpow
$ Set
.map swap dpow
27 distinctTriplesOneWay
:: Ord a
=> Set a
-> Set
(a
, a
, a
)
28 distinctTriplesOneWay
=
29 Set
.map (\xyzs
-> let [x
, y
, z
] = Set
.toList xyzs
in (x
, y
, z
))