To save the permissions of the user account from the outside (for example, in the database), I want to present a list of enumeration elements that have a derived instance Enumlike Int.
Each bit of the number is considered as a flag (or logical), indicating that the ith element is present in the list.
Putting it in different words - each degree 2 represents one element, and the sum of such powers is a unique list of elements.
Example:
data Permissions = IsAllowedToLogin -- 1
| IsModerator -- 2
| IsAdmin -- 4
deriving (Bounded, Enum, Eq, Show)
enumsToInt [IsAllowedToLogin, IsAdmin] == 1 + 4 == 5
intToEnums 3 == intToEnums (1 + 2) == [IsAllowedToLogin, IsModerator]
A function that converts such a list to Intis pretty easy to write:
enumsToInt :: (Enum a, Eq a) => [a] -> Int
enumsToInt = foldr (\p acc -> acc + 2 ^ fromEnum p) 0 . nub
Note that the accepted answer contains a much more efficient implementation.
What really bothers me is the reverse function. I can imagine that it should have this type:
intToEnums :: (Bounded a, Enum a) => Int -> [a]
intToEnums = undefined -- What I'm asking about
?