Advertisement
Guest User

Control.Monad.Trans.Dijkstra

a guest
Oct 1st, 2014
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE FlexibleInstances #-}
  2. {-# LANGUAGE MultiParamTypeClasses #-}
  3. {-# LANGUAGE NoImplicitPrelude #-}
  4. {-# LANGUAGE Rank2Types #-}
  5. {-# LANGUAGE UndecidableInstances #-}
  6.  
  7. module Control.Monad.Trans.Dijkstra
  8. ( Dijkstra , dijkstra , runDijkstra
  9. , fromState , toState
  10. , evalDijkstra , execDijkstra , mapDijkstra , withDijkstra
  11. , DijkstraT(..)
  12. , fromStateT , toStateT
  13. , evalDijkstraT , execDijkstraT , mapDijkstraT , withDijkstraT
  14. ) where
  15.  
  16. import Control.Applicative (Applicative(pure, (<*>)))
  17. import Control.Monad (Monad(return, (>>=)), (>=>), liftM)
  18. import Control.Monad.Reader (MonadReader(ask, local, reader))
  19. import Control.Monad.RWS (MonadRWS)
  20. import Control.Monad.State (MonadState(get, put, state), StateT(..), State(..))
  21. import Control.Monad.Trans (MonadTrans(lift))
  22. import Control.Monad.Writer (MonadWriter(listen, pass, tell, writer))
  23. import Data.Function ((.))
  24. import Data.Functor (Functor(fmap))
  25. import Data.Functor.Identity (Identity(..))
  26. import Data.Tuple (fst, snd)
  27.  
  28. type Dijkstra s = DijkstraT s Identity
  29.  
  30. dijkstra :: (forall r. ((a, s) -> r) -> s -> r) -> Dijkstra s a
  31. dijkstra f = DijkstraT (\asr -> runIdentity . f (Identity . asr))
  32.  
  33. runDijkstra :: Dijkstra s a -> forall r. ((a, s) -> r) -> s -> r
  34. runDijkstra m asr = runIdentity . runDijkstraT m (Identity . asr)
  35.  
  36. fromState :: State s a -> Dijkstra s a
  37. fromState = fromStateT
  38.  
  39. toState :: Dijkstra s a -> State s a
  40. toState = toStateT
  41.  
  42. evalDijkstra :: Dijkstra s a -> s -> a
  43. evalDijkstra m = runIdentity . evalDijkstraT m
  44.  
  45. execDijkstra :: Dijkstra s a -> s -> s
  46. execDijkstra m = runIdentity . execDijkstraT m
  47.  
  48. mapDijkstra :: ((a, s) -> (b, s)) -> Dijkstra s a -> Dijkstra s b
  49. mapDijkstra = mapDijkstraT . liftM
  50.  
  51. withDijkstra :: (s -> s) -> Dijkstra s a -> Dijkstra s a
  52. withDijkstra = withDijkstraT
  53.  
  54. newtype DijkstraT s m a = DijkstraT { runDijkstraT :: forall r. ((a, s) -> m r) -> s -> m r }
  55.  
  56. fromStateT :: (Monad m) => StateT s m a -> DijkstraT s m a
  57. fromStateT m = DijkstraT (runStateT m >=>)
  58.  
  59. toStateT :: (Monad m) => DijkstraT s m a -> StateT s m a
  60. toStateT m = StateT (runDijkstraT m return)
  61.  
  62. evalDijkstraT :: (Monad m) => DijkstraT s m a -> s -> m a
  63. -- evalDijkstraT = evalStateT . toStateT
  64. -- evalDijkstraT m = evalStateT (toStateT m)
  65. -- evalDijkstraT m = evalStateT (StateT (runDijkstraT m return))
  66. -- evalDijkstraT m s = liftM fst (runStateT (StateT (runDijkstraT m return)) s)
  67. -- evalDijkstraT m s = liftM fst (runDijkstraT m return s)
  68. evalDijkstraT m = runDijkstraT m (return . fst)
  69.  
  70. execDijkstraT :: (Monad m) => DijkstraT s m a -> s -> m s
  71. -- execDijkstraT = execStateT . toStateT
  72. -- execDijkstraT m = execStateT (toStateT m)
  73. -- execDijkstraT m = execStateT (StateT (runDijkstraT m return))
  74. -- execDijkstraT m s = liftM snd (runStateT (StateT (runDijkstraT m return)) s)
  75. -- execDijkstraT m s = liftM snd (runDijkstraT m return s)
  76. execDijkstraT m = runDijkstraT m (return . snd)
  77.  
  78. mapDijkstraT :: (Monad m, Monad n) => (m (a, s) -> n (b, s)) -> DijkstraT s m a -> DijkstraT s n b
  79. -- mapDijkstraT f = fromStateT . mapStateT f . toStateT
  80. -- mapDijkstraT f m = fromStateT (mapStateT f (toStateT m))
  81. -- mapDijkstraT f m = DijkstraT (runStateT (mapStateT f (StateT (runDijkstraT m return))) >=>)
  82. -- mapDijkstraT f m = DijkstraT (runStateT (StateT (f . runStateT (StateT (runDijkstraT m return)))) >=>)
  83. mapDijkstraT f m = DijkstraT ((f . runDijkstraT m return) >=>)
  84.  
  85. withDijkstraT :: (Monad m) => (s -> s) -> DijkstraT s m a -> DijkstraT s m a
  86. -- withDijkstraT f = fromStateT . withStateT f . toStateT
  87. -- withDijkstraT f m = fromStateT (withStateT f (toStateT m))
  88. -- withDijkstraT f m = DijkstraT (runStateT (withStateT f (StateT (runDijkstraT m return))) >=>)
  89. -- withDijkstraT f m = DijkstraT (runStateT (StateT (runStateT (StateT (runDijkstraT m return)) . f)) >=>)
  90. withDijkstraT f m = DijkstraT ((runDijkstraT m return . f) >=>)
  91.  
  92. instance Functor (DijkstraT s m) where
  93.     fmap ab m = DijkstraT (\bsmr -> runDijkstraT m (\ ~(a, s) -> bsmr (ab a, s)))
  94.  
  95. instance Applicative (DijkstraT s m) where
  96.     pure a = DijkstraT (\asmr s -> asmr (a, s))
  97.     mab <*> ma = DijkstraT (\bsmr -> runDijkstraT mab (\ ~(ab, s) -> runDijkstraT ma (\ ~(a, s') -> bsmr (ab a, s')) s))
  98.  
  99. instance Monad (DijkstraT s m) where
  100.     return a = DijkstraT (\asmr s -> asmr (a, s))
  101.     m >>= k = DijkstraT (\bsmr -> runDijkstraT m (\ ~(a, s) -> runDijkstraT (k a) bsmr s))
  102.  
  103. instance MonadTrans (DijkstraT s) where
  104.     lift ma = DijkstraT (\asmr s -> ma >>= \a -> asmr (a, s))
  105.  
  106. instance (MonadReader r m) => MonadReader r (DijkstraT s m) where
  107.     ask = lift ask
  108.     local = mapDijkstraT . local
  109.     reader = lift . reader
  110.  
  111. instance (MonadWriter w m) => MonadWriter w (DijkstraT s m) where
  112.     listen = mapDijkstraT (liftM swap_ . listen)
  113.     pass = mapDijkstraT (pass . liftM swap_)
  114.     tell = lift . tell
  115.     writer = lift . writer
  116.  
  117. instance MonadState s (DijkstraT s m) where
  118.     get = DijkstraT (\ssmr s -> ssmr (s, s))
  119.     put s = DijkstraT (\xsmr _ -> xsmr ((), s))
  120.     state sas = DijkstraT (. sas)
  121.  
  122. instance (MonadReader r m, MonadWriter w m) => MonadRWS r w s (DijkstraT s m)
  123.  
  124. swap_ :: ((a, b), c) -> ((a, c), b)
  125. swap_   ~((a, b), c) =  ((a, c), b)
  126. {-# INLINABLE swap_ #-}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement