Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# Language FunctionalDependencies,MultiParamTypeClasses #-}
- import Data.Functor.Apply
- import Data.Maybe (fromJust)
- class GetS_r r f | f -> r where
- getS_r :: f a -> (r a,Maybe (f a))
- class SetS_r r f | f -> r where
- setS_r :: (r a,Maybe (f a)) -> f a
- --
- type SafeState s a = s -> (a, Maybe s)
- type CoSafeState s a = (a, Maybe s) -> s
- unfoldSafeState :: SafeState s a -> (CoSafeState b a) -> s -> b
- unfoldSafeState f c = go
- where
- go = c . fmap (fmap go) . f
- traverse1Default :: (GetS_r r t, SetS_r r' t', Apply f) => (r a -> f (r' b)) -> t a -> f (t' b)
- traverse1Default f = unfoldSafeState getS_r g
- where
- g (ra,Nothing) = (\ x -> setS_r (x,Nothing)) <$> f ra
- g (ra,Just xs) = (\ x xs' -> setS_r (x,Just xs')) <$> f ra <.> xs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement