Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. {-# LANGUAGE RankNTypes #-}
  2.  
  3. data Identity a = Identity { runIdentity :: a }
  4. data Const a b = Const { runConst :: a }
  5.  
  6. instance Functor Identity where
  7. fmap f (Identity x) = Identity (f x)
  8.  
  9. instance Functor (Const a) where
  10. fmap f (Const x) = Const x
  11.  
  12. type Lens large large' small small' = forall f. Functor f => (small -> f small') -> (large -> f large')
  13. type Lens' large small = Lens large large small small
  14.  
  15. (|>) = flip ($)
  16.  
  17. lens :: (large -> small) -> (large -> small' -> large') -> Lens large large' small small'
  18. lens getter setter = newLens where
  19. newLens pure' obj = setter obj <$> pure' (getter obj)
  20.  
  21. _1 :: Lens (a, b) (a', b) a a'
  22. _1 = lens getter setter where
  23. getter (a, _) = a
  24. setter (_, b) a = (a, b)
  25.  
  26. _2 :: Lens (a, b) (a, b') b b'
  27. _2 = lens getter setter where
  28. getter (_, b) = b
  29. setter (a, _) b = (a, b)
  30.  
  31. over :: Lens large large' small small' -> (small -> small') -> (large -> large')
  32. over lens' f obj = runIdentity $ lens' (Identity . f) obj
  33.  
  34. set :: Lens large large' small small' -> small' -> (large -> large')
  35. set lens' value = over lens' (const value)
  36.  
  37. view :: Lens large large' small small' -> large -> small
  38. view lens' obj = runConst $ lens' Const obj
  39.  
  40. main :: IO ()
  41. main =
  42. (10 :: Int, "hello")
  43. |> over _1 succ
  44. |> over _2 length
  45. |> set _1 (view (_1._2) ((False, "Hello"), True))
  46. |> print
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement