easyrender-0.1.0.0: Graphics/EasyRender/Auxiliary.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
-- | This module provides miscellaneous general-purpose auxiliary
-- functions used by the "Graphics.EasyRender" package.
module Graphics.EasyRender.Auxiliary where
-- ----------------------------------------------------------------------
-- * Arithmetic operations
-- | A version of the 'ceiling' function that returns an 'Integer'.
int_ceiling :: RealFrac a => a -> Integer
int_ceiling = toInteger . ceiling
-- ----------------------------------------------------------------------
-- * The Curry type class
-- | The 'Curry' type class is used to implement functions that have a
-- variable number of arguments. It provides a family of type
-- isomorphisms
--
-- @fun ≅ args -> res,@
--
-- where
--
-- > fun = a1 -> a2 -> ... -> an -> res,
-- > args = (a1, (a2, (..., (an, ())))).
class Curry fun args res | args res -> fun where
-- | Multiple curry: map a function
-- (/a/[sub 1], (/a/[sub 2], (…, ())) → /b/
-- to its curried form
-- /a/[sub 1] → /a/[sub 2] → … → /b/.
mcurry :: (args -> res) -> fun
-- | Multiple uncurry: map a function
-- /a/[sub 1] → /a/[sub 2] → … → /b/
-- to its uncurried form
-- (/a/[sub 1], (/a/[sub 2], (…, ())) → /b/.
muncurry :: fun -> (args -> res)
instance Curry b () b where
mcurry g = g ()
muncurry x = const x
instance Curry fun args res => Curry (a -> fun) (a,args) res where
mcurry g x = mcurry (\xs -> g (x,xs))
muncurry f (x,xs) = muncurry (f x) xs