Advertisement
Guest User

Untitled

a guest
Feb 14th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# Language FunctionalDependencies,MultiParamTypeClasses #-}
  2.  
  3. import Data.Functor.Apply
  4. import Data.Maybe (fromJust)
  5. class GetS_r r f | f -> r where
  6.  getS_r :: f a -> (r a,Maybe (f a))
  7.  
  8. class SetS_r r f | f -> r  where
  9.  setS_r :: (r a,Maybe (f a)) -> f a
  10.  
  11. --
  12.  
  13. type SafeState   s a = s -> (a, Maybe s)
  14. type CoSafeState s a = (a, Maybe s) -> s
  15.  
  16. unfoldSafeState :: SafeState s a -> (CoSafeState b a) -> s ->  b
  17. unfoldSafeState f c = go
  18.  where
  19.      go = c . fmap (fmap go) . f
  20.  
  21. traverse1Default :: (GetS_r r t, SetS_r r' t', Apply f) => (r a -> f (r' b)) -> t a -> f (t' b)
  22. traverse1Default f = unfoldSafeState getS_r g
  23.  where
  24.   g (ra,Nothing) = (\ x     -> setS_r (x,Nothing))  <$> f ra
  25.   g (ra,Just xs) = (\ x xs' -> setS_r (x,Just xs')) <$> f ra <.> xs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement