blob: 66363ded6f30947218f10e9e471855e89ad93982 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE StaticPointers #-}
-- | A test to use symbols produced by the static form.
module Main(main) where
import Data.Typeable
import GHC.StaticPtr
main :: IO ()
main = do
lookupKey (static (id . id)) >>= \f -> print $ f (1 :: Int)
lookupKey (static method :: StaticPtr (Char -> Int)) >>= \f -> print $ f 'a'
print $ deRefStaticPtr (static g)
print $ deRefStaticPtr p0 'a'
print $ deRefStaticPtr (static t_field) $ T 'b'
where
g :: String
g = "found"
lookupKey :: StaticPtr a -> IO a
lookupKey p = unsafeLookupStaticPtr (staticKey p) >>= \case
Just p -> return $ deRefStaticPtr p
Nothing -> error $ "couldn't find " ++ show (staticPtrInfo p)
p0 :: Typeable a => StaticPtr (a -> a)
p0 = static (\x -> x)
data T a = T { t_field :: a }
deriving Typeable
class C1 a where
method :: a -> Int
instance C1 Char where
method = const 0
|