packages feed

FiniteCategories-0.1.0.0: src/Utils/SetList.hs

{-| Module  : FiniteCategories
Description : Utilitary functions for sets with list as underlying representation.
Copyright   : Guillaume Sabbagh 2021
License     : GPL-3
Maintainer  : guillaumesabbagh@protonmail.com
Stability   : experimental
Portability : portable

Utilitary functions for sets with list as underlying representation.

It has the advantage of not requiring the Ord typeclass at all.
-}

module Utils.SetList
(
    isIncludedIn,
    doubleInclusion,
    powerList
) where
    -- | Returns a boolean indicating if the set of elements of a list are included in an another.
    isIncludedIn :: (Eq a) => [a] -> [a] -> Bool
    [] `isIncludedIn` _ = True
    (x:xs) `isIncludedIn` l2
        | x `elem` l2 = xs `isIncludedIn` l2
        | otherwise = False
        
    -- | Returns a boolean indicating if the set of elements of two lists are equal.
    doubleInclusion :: (Eq a) => [a] -> [a] -> Bool
    l1 `doubleInclusion` l2 = (l1 `isIncludedIn` l2) && (l2 `isIncludedIn` l1)
    
    -- | Returns the list of all sublists of a list.
    powerList :: (Eq a) => [a] -> [[a]]
    powerList [] = [[]]
    powerList (x:xs) = (powerList xs) ++ ((x:) <$> (powerList xs))