Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE RankNTypes #-}
- data Identity a = Identity { runIdentity :: a }
- data Const a b = Const { runConst :: a }
- instance Functor Identity where
- fmap f (Identity x) = Identity (f x)
- instance Functor (Const a) where
- fmap f (Const x) = Const x
- type Lens large large' small small' = forall f. Functor f => (small -> f small') -> (large -> f large')
- type Lens' large small = Lens large large small small
- (|>) = flip ($)
- lens :: (large -> small) -> (large -> small' -> large') -> Lens large large' small small'
- lens getter setter = newLens where
- newLens pure' obj = setter obj <$> pure' (getter obj)
- _1 :: Lens (a, b) (a', b) a a'
- _1 = lens getter setter where
- getter (a, _) = a
- setter (_, b) a = (a, b)
- _2 :: Lens (a, b) (a, b') b b'
- _2 = lens getter setter where
- getter (_, b) = b
- setter (a, _) b = (a, b)
- over :: Lens large large' small small' -> (small -> small') -> (large -> large')
- over lens' f obj = runIdentity $ lens' (Identity . f) obj
- set :: Lens large large' small small' -> small' -> (large -> large')
- set lens' value = over lens' (const value)
- view :: Lens large large' small small' -> large -> small
- view lens' obj = runConst $ lens' Const obj
- main :: IO ()
- main =
- (10 :: Int, "hello")
- |> over _1 succ
- |> over _2 length
- |> set _1 (view (_1._2) ((False, "Hello"), True))
- |> print
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement