packages feed

fpnla-examples-0.1: src/FPNLA/Utils.hs

{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE IncoherentInstances  #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE UndecidableInstances #-}

module FPNLA.Utils (
    iif,
    mapPair,
    splitSlice,

    prevEnum,
    nextEnum,
    enumerate,
) where

mapPair :: (a -> b) -> (c -> d)-> (a, c) -> (b, d)
mapPair f g (a, c) = (f a,  g c)

-- inline if
iif :: Bool -> a -> a -> a
iif cond expTrue expFalse = if cond then expTrue else expFalse

-- Parte la lista parametro en trozos de tamaño 'n'. El último puede ser mas pequeño si no existe k tal que length ls = k * n.
splitSlice :: Int -> [a] -> [[a]]
splitSlice 0 _ = error "El tamaño de n debe ser > 0"
splitSlice _ [] = []
splitSlice n ls = sl : splitSlice n sls
    where (sl, sls) = splitAt n ls

prevEnum :: (Eq a, Bounded a, Enum a) => a -> a
prevEnum a | a == minBound = maxBound
           | otherwise = pred a
nextEnum :: (Eq a, Bounded a, Enum a) => a -> a
nextEnum a | a == maxBound = minBound
           | otherwise = succ a

-- Devuelve una lista con los elementos de cualquier tipo que sea instancia de Enum y Bounded.
enumerate :: forall a. (Enum a, Bounded a) => [a]
enumerate = map toEnum [fromEnum (minBound :: a) .. fromEnum (maxBound :: a)]