{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -dcore-lint -fobject-code #-}
{-# OPTIONS_GHC -fplugin GHC.Magic.Dict.Plugin #-}
module GHC.Magic.Dict.Goods (
eq2MyEqInt,
neq2MyEqInt,
eq2MyEqPoly,
neq2MyEqPoly,
unRelatedBy,
give,
) where
import GHC.Magic.Dict.Compat
import GHC.Magic.Dict.Defs
eq2MyEqInt :: Int -> Int -> Bool
eq2MyEqInt = withDict @(MyEq Int) ((==) @Int) eq
neq2MyEqInt :: Int -> Int -> Bool
neq2MyEqInt = withDict @(MyEq Int) ((/=) @Int) eq
eq2MyEqPoly :: forall a. (Eq a) => a -> a -> Bool
eq2MyEqPoly = withDict @(MyEq a) ((==) @a) eq
neq2MyEqPoly :: forall a. (Eq a) => a -> a -> Bool
neq2MyEqPoly = withDict @(MyEq a) ((/=) @a) eq
unRelatedBy :: forall a b. (a -> b -> Bool) -> a -> b -> Bool
unRelatedBy rel = withDict @(Related a b) (fmap not . rel) related
give :: forall a r. a -> ((Given a) => r) -> r
give = withDict @(Given a)