Advertisement
Guest User

Untitled

a guest
Feb 16th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# Language
  2.  RankNTypes
  3. ,FunctionalDependencies
  4. ,FlexibleContexts
  5. ,ScopedTypeVariables
  6. #-}
  7.  
  8. module Traversable_r where
  9.  
  10. import Data.Monoid (Endo(..))
  11. import Endo1
  12. import Data.Functor.Identity
  13. import Control.Applicative (Const(..))
  14. import Data.Coerce
  15. import Data.Functor.Apply
  16. import Data.Maybe (fromJust)
  17.  
  18.  
  19. ----
  20. -- Functor_r
  21.  
  22. class Functor_r r f where
  23.  fmap_r :: (r a -> r b) -> f a -> f b
  24.  
  25. ----
  26. -- Foldable1_r
  27.  
  28. class Foldable_r r t => Foldable1_r r t | t -> r where
  29.  foldr1_r :: (r a -> Maybe b -> b) -> t a -> b
  30.  foldr1_r f xs = (runEndo1 (foldMap1_r (Endo1 . f) xs)) Nothing
  31.  foldMap1_r :: Semigroup m => (r a -> m) -> t a -> m
  32.  foldMap1_r f xs = (foldr1_r ((\ a b -> a <> fromJust b) . f) xs)
  33.  
  34. ----
  35. -- Traversable1_r
  36.  
  37. class (Foldable1_r r t, Traversable_r r t) => Traversable1_r r t | t -> r where
  38.  traverse1_r :: Apply f => (r a -> f (r b)) -> t a -> f (t b)
  39.  
  40. foldMap1_rDefault :: forall r t m a . (Traversable1_r r t,Semigroup m) => (r a -> m) -> t a -> m
  41. foldMap1_rDefault = coerce (traverse1_r :: (r a -> Const m (r ())) -> t a -> Const m (t ()))
  42. {-# INLINE foldMap1_rDefault #-}
  43.  
  44. ----
  45. -- Foldable_r
  46.  
  47. class Functor_r r t => Foldable_r r t | t -> r where
  48.  {-# MINIMAL foldMap_r | foldr_r #-}
  49.  foldMap_r :: Monoid m => (r a -> m) -> t a -> m
  50.  {-# INLINE foldMap_r #-}
  51.  foldMap_r f = foldr_r (mappend . f) mempty
  52.  foldr_r :: (r a -> b -> b) -> b -> t a -> b
  53.  foldr_r f z t = appEndo (foldMap_r (Endo . f) t) z
  54.  
  55. ----
  56. -- Traversable_r
  57.  
  58. class Foldable_r r t => Traversable_r r t | t -> r where
  59.  traverse_r :: (Applicative f) => (r a -> f (r b)) -> t a -> f (t b)
  60.  
  61. foldMap_rDefault :: forall r t m a . (Traversable_r r t,Monoid m) => (r a -> m) -> t a -> m
  62. foldMap_rDefault = coerce (traverse_r :: (r a -> Const m (r ())) -> t a -> Const m (t ()))
  63. {-# INLINE foldMap_rDefault #-}
  64.  
  65. fmap_rDefault :: forall r t a b . Traversable_r r t => (r a -> r b) -> t a -> t b
  66. {-# INLINE fmap_rDefault #-}
  67. fmap_rDefault = coerce (traverse_r :: (r a -> Identity (r b)) -> t a -> Identity (t b))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement