git.iko.soy/distributed-process
on master help sign in
Replace Data.Dynamic with custom library

in preparation for providing Closure combinators

commite3c0bbea141213013cb513e8fd38a4e6b702bc57 authorEdsko de Vries <edsko@edsko.net> dateTue 26 Jun 2012, 09:41 (14 years ago) parentd123b6c
6 files changed+78−4
distributed-process/distributed-process.cabal+2 distributed-process/src/Control/Distributed/Process.hs+1−1 distributed-process/src/Control/Distributed/Process/Closure.hs+1−1 distributed-process/src/Control/Distributed/Process/Internal/Dynamic.hs+72 distributed-process/src/Control/Distributed/Process/Internal/Types.hs+1−1 distributed-process/src/Control/Distributed/Process/Node.hs+1−1
distributed-process/distributed-process.cabal+2
@@ -20,6 +20,7 @@ Library
2020 random,
2121 template-haskell,
2222 stm,
23+ ghc-prim,
2324 network-transport >= 0.1
2425 Exposed-modules: Control.Distributed.Process,
2526 Control.Distributed.Process.Serializable,
@@ -43,6 +44,7 @@ Test-Suite TestCH
4344 ansi-terminal,
4445 template-haskell,
4546 stm,
47+ ghc-prim,
4648 network-transport >= 0.1
4749 Extensions: ExplicitForAll, ScopedTypeVariables, GeneralizedNewtypeDeriving, FlexibleInstances, UndecidableInstances, MultiParamTypeClasses, DeriveDataTypeable, TemplateHaskell, ExistentialQuantification
4850 ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N -fno-warn-unused-do-bind
distributed-process/src/Control/Distributed/Process.hs+1−1
@@ -63,7 +63,6 @@ module Control.Distributed.Process
6363import Prelude hiding (catch)
6464import Data.Binary (decode, encode)
6565import Data.Typeable (Typeable)
66−import Data.Dynamic (fromDyn)
6766import qualified Data.Map as Map ((!))
6867import Control.Monad.Reader (ask)
6968import Control.Monad.IO.Class (MonadIO, liftIO)
@@ -125,6 +124,7 @@ import Control.Distributed.Process.Internal.MessageT
125124 , sendBinary
126125 , getLocalNode
127126 )
127+import Control.Distributed.Process.Internal.Dynamic (fromDyn)
128128
129129-- INTERNAL NOTES
130130--
distributed-process/src/Control/Distributed/Process/Closure.hs+1−1
@@ -45,7 +45,6 @@ import Prelude hiding (lookup)
4545import Data.ByteString.Lazy (ByteString)
4646import Data.Binary (encode, decode)
4747import qualified Data.Map as Map (insert)
48−import Data.Dynamic (toDyn)
4948import Control.Applicative ((<$>))
5049import Control.Monad (join)
5150import Language.Haskell.TH
@@ -83,6 +82,7 @@ import Control.Distributed.Process.Internal.Types
8382 , CallReply(..)
8483 )
8584import Control.Distributed.Process (send, unClosure)
85+import Control.Distributed.Process.Internal.Dynamic (toDyn)
8686
8787--------------------------------------------------------------------------------
8888-- Top-level API --
distributed-process/src/Control/Distributed/Process/Internal/Dynamic.hsnew file+72
@@ -0,0 +1,72 @@
1+-- | Reimplementation of Dynamic that supports dynBind
2+--
3+-- We don't have access to the internal representation of Dynamic, otherwise
4+-- we would not have to redefine it completely. Note that we use this only
5+-- internally, so the incompatibility with "our" Dynamic from the standard
6+-- Dynamic is not important.
7+{-# LANGUAGE MagicHash #-}
8+module Control.Distributed.Process.Internal.Dynamic
9+ ( Dynamic
10+ , toDyn
11+ , fromDyn
12+ , fromDynamic
13+ , dynBindIO
14+ , dynBindIO'
15+ ) where
16+
17+import Data.Typeable
18+ ( Typeable
19+ , TypeRep
20+ , typeOf
21+ , TyCon
22+ , typeRepTyCon
23+ , splitTyConApp
24+ , funResultTy
25+ )
26+import qualified GHC.Prim as GHC (Any, unsafeCoerce#)
27+import Data.Maybe (fromMaybe)
28+
29+data Dynamic = Dynamic TypeRep GHC.Any
30+
31+toDyn :: Typeable a => a -> Dynamic
32+toDyn x = Dynamic (typeOf x) (GHC.unsafeCoerce# x)
33+
34+fromDyn :: Typeable a => Dynamic -> a -> a
35+fromDyn (Dynamic rep val) a =
36+ if rep == typeOf a
37+ then GHC.unsafeCoerce# val
38+ else a
39+
40+fromDynamic :: forall a. Typeable a => Dynamic -> Maybe a
41+fromDynamic (Dynamic rep val) =
42+ if rep == typeOf (undefined :: a)
43+ then Just (GHC.unsafeCoerce# val)
44+ else Nothing
45+
46+dynTypeRep :: Dynamic -> TypeRep
47+dynTypeRep (Dynamic t _) = t
48+
49+instance Show Dynamic where
50+ show = show . dynTypeRep
51+
52+tyConIO :: TyCon
53+tyConIO = typeRepTyCon (typeOf (undefined :: IO ()))
54+
55+bindIO :: IO a -> (a -> IO b) -> IO b
56+bindIO = (>>=)
57+
58+dynBindIO :: Dynamic -> Dynamic -> Maybe Dynamic
59+-- IO a -> (a -> IO b) -> IO b
60+dynBindIO (Dynamic t1 x) (Dynamic t2 f) =
61+ case splitTyConApp t1 of
62+ (io, [a]) | io == tyConIO ->
63+ case funResultTy t2 a of
64+ Just ioB -> Just (Dynamic ioB (GHC.unsafeCoerce# bindIO x f))
65+ _ -> Nothing
66+ _ -> Nothing
67+
68+dynBindIO' :: Dynamic -> Dynamic -> Dynamic
69+dynBindIO' x f = fromMaybe (error typeError) (dynBindIO x f)
70+ where
71+ typeError = "Type error in dynamic bind.\n"
72+ ++ "Can't bind " ++ show x ++ " to " ++ show f
distributed-process/src/Control/Distributed/Process/Internal/Types.hs+1−1
@@ -64,7 +64,6 @@ import Data.Map (Map)
6464import qualified Data.Map as Map (empty)
6565import Data.Int (Int32)
6666import Data.Typeable (Typeable)
67−import Data.Dynamic (Dynamic)
6867import Data.Binary (Binary, encode, put, get, putWord8, getWord8)
6968import Data.ByteString.Lazy (ByteString)
7069import Data.Accessor (Accessor, accessor)
@@ -90,6 +89,7 @@ import Control.Distributed.Process.Serializable ( Fingerprint
9089 , sizeOfFingerprint
9190 )
9291import Control.Distributed.Process.Internal.CQueue (CQueue)
92+import Control.Distributed.Process.Internal.Dynamic (Dynamic)
9393
9494--------------------------------------------------------------------------------
9595-- Global state --
distributed-process/src/Control/Distributed/Process/Node.hs+1−1
@@ -20,7 +20,6 @@ import qualified Data.Set as Set (empty, insert, delete, member)
2020import Data.Foldable (forM_)
2121import Data.Maybe (isJust)
2222import Data.Typeable (Typeable)
23−import Data.Dynamic (fromDynamic)
2423import Control.Category ((>>>))
2524import Control.Applicative ((<$>))
2625import Control.Monad (void, when, forever)
@@ -99,6 +98,7 @@ import Control.Distributed.Process.Internal.MessageT
9998 , sendMessage
10099 , getLocalNode
101100 )
101+import Control.Distributed.Process.Internal.Dynamic (fromDynamic)
102102
103103--------------------------------------------------------------------------------
104104-- Initialization --