daily pastebin goal
23%
SHARE
TWEET

Control.Monad.Trans.Dijkstra

a guest Oct 1st, 2014 228 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_ #-}
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top