module Utils.Utils(
    universeToList,
    crop,
    listToUniverse
) where

import Data.List(nub)

flattenPairs :: [(a, a)] -> [a]
flattenPairs :: forall a. [(a, a)] -> [a]
flattenPairs = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(a
x ,a
y) -> forall a. [a] -> [a] -> [a]
(++) [a
x, a
y]) []

universeToList :: (Eq a) => [(a, a)] -> [a]
universeToList :: forall a. Eq a => [(a, a)] -> [a]
universeToList = forall a. Eq a => [a] -> [a]
nub forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [(a, a)] -> [a]
flattenPairs

listToUniverse :: (Eq a) => [a] -> [(a, a)] 
listToUniverse :: forall a. Eq a => [a] -> [(a, a)]
listToUniverse [a]
u = [(a
x, a
y) | a
x <- [a]
u, a
y <- [a]
u]

-- | Round real number to 6 digits

crop :: RealFloat a => a -> a
crop :: forall a. RealFloat a => a -> a
crop a
x = forall a. Num a => Integer -> a
fromInteger (forall a b. (RealFrac a, Integral b) => a -> b
round (a
x forall a. Num a => a -> a -> a
* (a
10forall a b. (Num a, Integral b) => a -> b -> a
^Integer
6))) forall a. Fractional a => a -> a -> a
/ (a
10.0forall a b. (Fractional a, Integral b) => a -> b -> a
^^Integer
6)