module IfCxt.Examples
( cxtShow
, cxtShowTypeable
, cxtNub
, Magic
, magic
)
where
import IfCxt
import Data.List
import Data.Typeable
mkIfCxtInstances ''Ord
mkIfCxtInstances ''Show
mkIfCxtInstances ''Typeable
cxtShow :: forall a. IfCxt (Show a) => a -> String
cxtShow a = ifCxt (Proxy::Proxy (Show a))
(show a)
"<<unshowable>>"
cxtShowTypeable :: forall a.
( IfCxt (Show a)
, IfCxt (Typeable a)
) => a -> String
cxtShowTypeable = ifCxt (Proxy::Proxy (Show a))
show
( ifCxt (Proxy::Proxy (Typeable a))
(\a -> "<<"++show (typeOf a) ++">>")
(const "<<unshowable>>")
)
cxtNub :: forall a. (Eq a, IfCxt (Ord a)) => [a] -> [a]
cxtNub = ifCxt (Proxy::Proxy (Ord a)) nubOrd nub
where
nubOrd :: Ord a => [a] -> [a]
nubOrd = go . sort
where
go (x1:x2:xs)
| x1==x2 = go (x2:xs)
| otherwise = x1 : go (x2:xs)
go [x] = [x]
go [] = []
cxtSum :: forall a. (Num a, IfCxt (Floating a)) => [a] -> a
cxtSum = ifCxt (Proxy::Proxy (Floating a)) sumKahan sumSimple
where
sumSimple :: Num b => [b] -> b
sumSimple = foldl' (+) 0
sumKahan :: Num b => [b] -> b
sumKahan = snd . foldl' go (0,0)
where
go (c,t) i = ((t't)y,t')
where
y = ic
t' = t+y
class Magic
magic :: Int
magic = ifCxt (Proxy::Proxy Magic) 1 2