Guest User

Untitled

a guest
Feb 18th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. {-# LANGUAGE GADTs, DeriveFunctor, DeriveFoldable, TupleSections #-}
  2.  
  3. import Prelude hiding (reverse, splitAt, head, concat, foldl, concatMap)
  4. import Control.Applicative
  5. import Data.Foldable
  6. import Data.Traversable
  7. import GHC.Exts (Down(..))
  8. import Control.Arrow ((***))
  9. import Data.Maybe (listToMaybe)
  10. import Data.Either (partitionEithers)
  11. import Data.Monoid
  12. import Data.Void
  13.  
  14. import qualified Data.Map as Map
  15. import Data.Map (Map, (!))
  16. import qualified Data.Stream.Infinite as Stream
  17. import Data.Stream.Infinite (Stream(..))
  18.  
  19.  
  20. -- Reactive model a la reactive banana
  21. -- The Stream represents time, with a list of events for simultaneous events.
  22. type Events a = Stream [a]
  23.  
  24.  
  25. data Change k a = Insert k a | Delete k deriving (Show, Eq, Ord, Functor, Foldable)
  26.  
  27. deletedKeys :: Ord k => [Change k a] -> [k]
  28. deletedKeys = concatMap f
  29. where
  30. f Insert{} = []
  31. f (Delete k) = [k]
  32.  
  33. mapKey :: (k1 -> k2) -> Change k1 a -> Change k2 a
  34. mapKey f (Insert k a) = Insert (f k) a
  35. mapKey f (Delete k) = Delete (f k)
  36.  
  37. change :: Ord k => Change k a -> Map k a -> Map k a
  38. change (Insert k a) = Map.insert k a
  39. change (Delete k) = Map.delete k
  40.  
  41. changes :: Ord k => [Change k a] -> Map k a -> Map k a
  42. changes = flip (foldl (flip change))
  43.  
  44.  
  45. data RList a where
  46. RList :: Ord k => Events (Change k a) -> RList a
  47.  
  48. instance Functor RList where
  49. fmap f (RList css) = RList $ fmap (map (fmap f)) css
  50.  
  51. instance Applicative RList where
  52. pure a = RList $ [Insert () a] :> pure []
  53. RList fss <*> RList ass = RList . snd $ mapAccumL doAcc (Map.empty, Map.empty) (Stream.zip fss ass)
  54. where
  55. doAcc (mf, ma) (fs, as) =
  56. let mf' = fs `changes` mf
  57. ma' = as `changes` ma
  58. in ((mf', ma'),
  59. ((\c (k, a) -> mapKey (,k) (fmap ($ a) c)) <$> fs <*> Map.toList ma') ++
  60. ((\(k, f) c -> mapKey (k,) (fmap f c)) <$> Map.toList mf' <*> as) ++
  61. ((\k1 k2 -> Delete (k1, k2)) <$> deletedKeys fs <*> deletedKeys as))
  62.  
  63. instance Alternative RList where
  64. empty = RList $ pure ([] :: [Change Void a])
  65. RList lss <|> RList rss = RList ((\ls rs -> map (mapKey Left) ls ++ map (mapKey Right) rs) <$> lss <*> rss)
  66.  
  67.  
  68.  
  69. rFoldMap :: Monoid m => (a -> m) -> RList a -> Events m
  70. rFoldMap f (RList css) = snd $ mapAccumL (\a cs -> let m = cs `changes` a in (m, [foldMap f m])) Map.empty css
  71.  
  72. toRVal :: RList a -> Events [a]
  73. toRVal = rFoldMap (:[])
  74.  
  75. fromList :: [a] -> RList a
  76. fromList = RList . (:> pure []) . zipWith Insert [(0::Int)..]
  77.  
  78.  
  79. cons :: a -> RList a -> RList a
  80. cons a (RList (cs :> css)) = RList ((Insert Nothing a : map (mapKey Just) cs) :> fmap (map (mapKey Just)) css)
  81.  
  82. sort :: Ord a => RList a -> RList a
  83. sort (RList css) = RList . snd $ mapAccumL (mapAccumL (\m c -> (change c m, f c m))) Map.empty css
  84. where
  85. f (Insert _ a) _ = Insert a a
  86. f (Delete k) m = Delete (m ! k)
  87.  
  88. reverse :: RList a -> RList a
  89. reverse (RList css) = RList $ fmap (map (mapKey Down)) css
  90.  
  91. head :: RList a -> Events (Maybe a)
  92. head = fmap (map listToMaybe) . toRVal . fst . splitAt 1
  93.  
  94. splitAt :: Int -> RList a -> (RList a, RList a)
  95. splitAt n (RList css) = (RList *** RList) . Stream.unzip . Stream.map (partitionEithers . concat) . snd $
  96. mapAccumL (mapAccumL (\m c -> (change c m, f c m))) Map.empty css
  97. where
  98. f c _ | n == 0 = [Right c]
  99. f c@Insert{} m | Map.size m < n = [Left c]
  100. f c@(Insert k _) m = if k > kn_1 then [Right c] else [Left c, Left $ Delete kn_1, Right $ Insert kn_1 an_1]
  101. where (kn_1, an_1) = Map.elemAt (n - 1) m
  102. f c@Delete{} m | Map.size m <= n = [Left c]
  103. f c@(Delete k ) m = if k >= kn then [Right c] else [Left c, Left $ Insert kn an, Right $ Delete kn]
  104. where (kn, an) = Map.elemAt n m
  105.  
  106.  
  107.  
  108. test :: RList Char
  109. test = RList $ [Insert (0::Int) 'a'] :> [Insert 1 'b'] :> [Delete 0] :> [Delete 1] :> [Insert (-1) '0'] :> [Insert 0 'A'] :> pure []
Add Comment
Please, Sign In to add comment