Guest User

Untitled

a guest
Mar 24th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.92 KB | None | 0 0
  1. #!/usr/bin/env stack
  2. {-
  3. stack
  4. script
  5. --resolver lts-11.0
  6. --ghc-options -Wall
  7. -}
  8.  
  9. {-# LANGUAGE RankNTypes #-}
  10.  
  11. import Control.Lens
  12. import Data.Map
  13.  
  14. data Animal =
  15. Animal
  16. { tags :: Int
  17. } deriving (Show)
  18.  
  19. data Model =
  20. Model
  21. { animals :: Map String Animal
  22. } deriving (Show)
  23.  
  24. model :: Model
  25. model =
  26. Model
  27. { animals = fromList
  28. [ ("jake", Animal { tags = 4 })
  29. , ("skitter", Animal { tags = 6 })
  30. ]
  31. }
  32.  
  33. modelToAnimals :: Lens' Model (Map String Animal)
  34. modelToAnimals = lens animals (\oldModel newAnimals -> oldModel { animals = newAnimals })
  35.  
  36. animalToTags :: Lens' Animal Int
  37. animalToTags = lens tags (\oldAnimal newTags -> oldAnimal { tags = newTags })
  38.  
  39. modelToTags :: String -> Traversal' Model Int
  40. modelToTags name = modelToAnimals . at name . _Just . animalToTags
  41.  
  42. jake :: Maybe Int
  43. jake = preview (modelToTags "jake") model
  44.  
  45. main :: IO ()
  46. main = print jake -- Just 4
Add Comment
Please, Sign In to add comment