hafar-0.1.0.0: src/Numeric/AffineForm/Utils.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DataKinds #-}
-- | Provides some useful functions
module Numeric.AffineForm.Utils (
embed, sumup,
pmod', clamp,
) where
import Data.Fixed
import Numeric.AffineForm.ExplicitRounding
-- | Zips the two lists together, padding the shorter list with zeroes
embed :: (Num a, Num b) => [a] -> [b] -> [(a,b)]
embed x y = take (max (length x) (length y)) $ zip infx infy
where infx = x ++ repeat 0
infy = y ++ repeat 0
-- | Sawtooth function with period `b`
pmod' :: (Ord a, RealFrac a) => a -> a -> a
pmod' a b
| a < 0 = pmod' (a + b*(fromIntegral . ceiling . abs $ a/b)) b
| otherwise = a `mod'` b
-- | Clamps `x` between values `a` and `b`
clamp :: (Ord a) => a -> a -> a -> a
clamp x a b = min (max a x) b
-- | Like sum but rounds all values up
sumup :: (ExplicitRounding a) => [a] -> a
sumup = foldl (+/) 0