add lenses for apitypes

This commit is contained in:
Jon Schoning 2016-02-19 21:53:17 -06:00
parent fb8462aec6
commit 47befd59ea
8 changed files with 504 additions and 4 deletions

View file

@ -44,6 +44,30 @@ Posts{postsDate = 2015 - 10 - 24 16 : 17 : 12 UTC,
postToRead = False,
postTags = ["spj", "video", "haskell", "typetheory"]}]}
```
### getPostsRecent (using Lenses)
``` {.haskell}
{-# LANGUAGE OverloadedStrings #-}
import Pinboard
import Control.Lens
main :: IO ()
main = do
let config = fromApiToken "api token"
result <- runPinboard config $ getPostsRecent (Just ["haskell"]) (Just 3)
mapM_ print (result ^.. _Right . postsPostsL . traverse . postHrefL)
```
output:
```
"http://www.stephendiehl.com/posts/production.html"
"https://mail.haskell.org/mailman/listinfo"
"https://en.wikibooks.org/wiki/Haskell/Applicative_functors#A_sliding_scale_of_power"
```
## Modules
[Pinboard.Types](https://hackage.haskell.org/package/pinboard/docs/Pinboard-Types.html)
@ -61,3 +85,7 @@ Posts{postsDate = 2015 - 10 - 24 16 : 17 : 12 UTC,
[Pinboard.ApiTypes](https://hackage.haskell.org/package/pinboard/docs/Pinboard-ApiTypes.html)
Pinboard Data Structures returned by the Api
[Pinboard.ApiTypesLens](https://hackage.haskell.org/package/pinboard/docs/Pinboard-ApiTypesLens.html)
Lens accessors for Pinboard.ApiTypes

View file

@ -1,3 +1,7 @@
__v0.9.3__
Add lenses
__v0.9.2__
Make data fields strict

View file

@ -1,5 +1,5 @@
name: pinboard
version: 0.9.2
version: 0.9.3
synopsis: Access to the Pinboard API
license: MIT
license-file: LICENSE
@ -32,6 +32,7 @@ library
, http-client-tls
, mtl >= 2.2.1
, old-locale
, profunctors >= 5
, network
, random >= 1.1
, text
@ -41,12 +42,13 @@ library
, vector
default-language: Haskell2010
other-modules:
other-modules:
exposed-modules:
Pinboard
Pinboard.Api
Pinboard.ApiRequest
Pinboard.ApiTypes
Pinboard.ApiTypesLens
Pinboard.Client
Pinboard.Error
Pinboard.Types

10
samples/sampleLens.hs Normal file
View file

@ -0,0 +1,10 @@
{-# LANGUAGE OverloadedStrings #-}
import Pinboard
import Control.Lens
main :: IO ()
main = do
let config = fromApiToken "api token"
result <- runPinboard config $ getPostsRecent (Just ["haskell"]) (Just 3)
mapM_ print (result ^.. _Right . postsPostsL . traverse . postHrefL)

View file

@ -30,9 +30,13 @@ module Pinboard (
-- * Pinboard.ApiTypes
-- | Pinboard Data Structures returned by the Api
, module Pinboard.ApiTypes
-- * Pinboard.ApiTypesLens
-- | Lens accessors for Pinboard.ApiTypes
, module Pinboard.ApiTypesLens
) where
import Pinboard.Client
import Pinboard.Api
import Pinboard.ApiRequest
import Pinboard.ApiTypes
import Pinboard.ApiTypesLens

View file

@ -11,7 +11,7 @@
-- Maintainer : jonschoning@gmail.com
-- Stability : experimental
-- Portability : POSIX
module Pinboard.ApiTypes where
module Pinboard.ApiTypes where
import Data.Aeson
import Data.Aeson.Types (Parser)

View file

@ -0,0 +1,452 @@
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
module Pinboard.ApiTypesLens where
import Pinboard.ApiTypes
import Data.Text (Text)
import Data.Time (UTCTime)
import Data.Time.Calendar (Day)
import Control.Applicative
import Data.Profunctor
import Data.Either
import Prelude hiding (words, unwords)
-- * Lens Aliases
type Lens_' s a = Lens_ s s a a
type Lens_ s t a b = forall (f :: * -> *). Functor f => (a -> f b) -> s -> f t
type Prism_' s a = Prism_ s s a a
type Prism_ s t a b = forall (p :: * -> * -> *) (f :: * -> *). (Choice p, Applicative f) => p a (f b) -> p s (f t)
-- * Posts
postsDateL :: Lens_' Posts UTCTime
postsDateL f_acx6 (Posts x1_acx7 x2_acx8 x3_acx9)
= fmap
(\ y1_acxa -> Posts y1_acxa x2_acx8 x3_acx9) (f_acx6 x1_acx7)
{-# INLINE postsDateL #-}
postsPostsL :: Lens_' Posts [Post]
postsPostsL f_acxb (Posts x1_acxc x2_acxd x3_acxe)
= fmap
(\ y1_acxf -> Posts x1_acxc x2_acxd y1_acxf) (f_acxb x3_acxe)
{-# INLINE postsPostsL #-}
postsUserL :: Lens_' Posts Text
postsUserL f_acxg (Posts x1_acxh x2_acxi x3_acxj)
= fmap
(\ y1_acxk -> Posts x1_acxh y1_acxk x3_acxj) (f_acxg x2_acxi)
{-# INLINE postsUserL #-}
-- * Post
postDescriptionL :: Lens_' Post Text
postDescriptionL
f_aczI
(Post x1_aczJ
x2_aczK
x3_aczL
x4_aczM
x5_aczN
x6_aczO
x7_aczP
x8_aczQ
x9_aczR)
= fmap
(\ y1_aczS
-> Post
x1_aczJ
y1_aczS
x3_aczL
x4_aczM
x5_aczN
x6_aczO
x7_aczP
x8_aczQ
x9_aczR)
(f_aczI x2_aczK)
{-# INLINE postDescriptionL #-}
postExtendedL :: Lens_' Post Text
postExtendedL
f_aczT
(Post x1_aczU
x2_aczV
x3_aczW
x4_aczX
x5_aczY
x6_aczZ
x7_acA0
x8_acA1
x9_acA2)
= fmap
(\ y1_acA3
-> Post
x1_aczU
x2_aczV
y1_acA3
x4_aczX
x5_aczY
x6_aczZ
x7_acA0
x8_acA1
x9_acA2)
(f_aczT x3_aczW)
{-# INLINE postExtendedL #-}
postHashL :: Lens_' Post Text
postHashL
f_acA4
(Post x1_acA5
x2_acA6
x3_acA7
x4_acA8
x5_acA9
x6_acAa
x7_acAb
x8_acAc
x9_acAd)
= fmap
(\ y1_acAe
-> Post
x1_acA5
x2_acA6
x3_acA7
x4_acA8
y1_acAe
x6_acAa
x7_acAb
x8_acAc
x9_acAd)
(f_acA4 x5_acA9)
{-# INLINE postHashL #-}
postHrefL :: Lens_' Post Text
postHrefL
f_acAf
(Post x1_acAg
x2_acAh
x3_acAi
x4_acAj
x5_acAk
x6_acAl
x7_acAm
x8_acAn
x9_acAo)
= fmap
(\ y1_acAp
-> Post
y1_acAp
x2_acAh
x3_acAi
x4_acAj
x5_acAk
x6_acAl
x7_acAm
x8_acAn
x9_acAo)
(f_acAf x1_acAg)
{-# INLINE postHrefL #-}
postMetaL :: Lens_' Post Text
postMetaL
f_acAq
(Post x1_acAr
x2_acAs
x3_acAt
x4_acAu
x5_acAv
x6_acAw
x7_acAx
x8_acAy
x9_acAz)
= fmap
(\ y1_acAA
-> Post
x1_acAr
x2_acAs
x3_acAt
y1_acAA
x5_acAv
x6_acAw
x7_acAx
x8_acAy
x9_acAz)
(f_acAq x4_acAu)
{-# INLINE postMetaL #-}
postSharedL :: Lens_' Post Bool
postSharedL
f_acAB
(Post x1_acAC
x2_acAD
x3_acAE
x4_acAF
x5_acAG
x6_acAH
x7_acAI
x8_acAJ
x9_acAK)
= fmap
(\ y1_acAL
-> Post
x1_acAC
x2_acAD
x3_acAE
x4_acAF
x5_acAG
x6_acAH
y1_acAL
x8_acAJ
x9_acAK)
(f_acAB x7_acAI)
{-# INLINE postSharedL #-}
postTagsL :: Lens_' Post [Tag]
postTagsL
f_acAM
(Post x1_acAN
x2_acAO
x3_acAP
x4_acAQ
x5_acAR
x6_acAS
x7_acAT
x8_acAU
x9_acAV)
= fmap
(\ y1_acAW
-> Post
x1_acAN
x2_acAO
x3_acAP
x4_acAQ
x5_acAR
x6_acAS
x7_acAT
x8_acAU
y1_acAW)
(f_acAM x9_acAV)
{-# INLINE postTagsL #-}
postTimeL :: Lens_' Post UTCTime
postTimeL
f_acAX
(Post x1_acAY
x2_acAZ
x3_acB0
x4_acB1
x5_acB2
x6_acB3
x7_acB4
x8_acB5
x9_acB6)
= fmap
(\ y1_acB7
-> Post
x1_acAY
x2_acAZ
x3_acB0
x4_acB1
x5_acB2
y1_acB7
x7_acB4
x8_acB5
x9_acB6)
(f_acAX x6_acB3)
{-# INLINE postTimeL #-}
postToReadL :: Lens_' Post Bool
postToReadL
f_acB8
(Post x1_acB9
x2_acBa
x3_acBb
x4_acBc
x5_acBd
x6_acBe
x7_acBf
x8_acBg
x9_acBh)
= fmap
(\ y1_acBi
-> Post
x1_acB9
x2_acBa
x3_acBb
x4_acBc
x5_acBd
x6_acBe
x7_acBf
y1_acBi
x9_acBh)
(f_acB8 x8_acBg)
{-# INLINE postToReadL #-}
-- * PostDates
postDatesCountL :: Lens_' PostDates [(Day, Int)]
postDatesCountL f_a1M4D (PostDates x1_a1M4E x2_a1M4F x3_a1M4G)
= fmap
(\ y1_a1M4H -> PostDates x1_a1M4E x2_a1M4F y1_a1M4H)
(f_a1M4D x3_a1M4G)
{-# INLINE postDatesCountL #-}
postDatesTagL :: Lens_' PostDates Text
postDatesTagL f_a1M4I (PostDates x1_a1M4J x2_a1M4K x3_a1M4L)
= fmap
(\ y1_a1M4M -> PostDates x1_a1M4J y1_a1M4M x3_a1M4L)
(f_a1M4I x2_a1M4K)
{-# INLINE postDatesTagL #-}
postDatesUserL :: Lens_' PostDates Text
postDatesUserL f_a1M4N (PostDates x1_a1M4O x2_a1M4P x3_a1M4Q)
= fmap
(\ y1_a1M4R -> PostDates y1_a1M4R x2_a1M4P x3_a1M4Q)
(f_a1M4N x1_a1M4O)
{-# INLINE postDatesUserL #-}
-- * NoteList
noteListCountL :: Lens_' NoteList Int
noteListCountL f_acwZ (NoteList x1_acx0 x2_acx1)
= fmap (\ y1_acx2 -> NoteList y1_acx2 x2_acx1) (f_acwZ x1_acx0)
{-# INLINE noteListCountL #-}
noteListItemsL :: Lens_' NoteList [NoteListItem]
noteListItemsL f_acx3 (NoteList x1_acx4 x2_acx5)
= fmap (\ y1_acx6 -> NoteList x1_acx4 y1_acx6) (f_acx3 x2_acx5)
{-# INLINE noteListItemsL #-}
-- * NoteListItem
noteListItemCreatedAtL :: Lens_' NoteListItem UTCTime
noteListItemCreatedAtL
f_acx0
(NoteListItem x1_acx1 x2_acx2 x3_acx3 x4_acx4 x5_acx5 x6_acx6)
= fmap
(\ y1_acx7
-> NoteListItem x1_acx1 x2_acx2 x3_acx3 x4_acx4 y1_acx7 x6_acx6)
(f_acx0 x5_acx5)
{-# INLINE noteListItemCreatedAtL #-}
noteListItemHashL :: Lens_' NoteListItem Text
noteListItemHashL
f_acx8
(NoteListItem x1_acx9 x2_acxa x3_acxb x4_acxc x5_acxd x6_acxe)
= fmap
(\ y1_acxf
-> NoteListItem x1_acx9 y1_acxf x3_acxb x4_acxc x5_acxd x6_acxe)
(f_acx8 x2_acxa)
{-# INLINE noteListItemHashL #-}
noteListItemIdL :: Lens_' NoteListItem Text
noteListItemIdL
f_acxg
(NoteListItem x1_acxh x2_acxi x3_acxj x4_acxk x5_acxl x6_acxm)
= fmap
(\ y1_acxn
-> NoteListItem y1_acxn x2_acxi x3_acxj x4_acxk x5_acxl x6_acxm)
(f_acxg x1_acxh)
{-# INLINE noteListItemIdL #-}
noteListItemLengthL :: Lens_' NoteListItem Int
noteListItemLengthL
f_acxo
(NoteListItem x1_acxp x2_acxq x3_acxr x4_acxs x5_acxt x6_acxu)
= fmap
(\ y1_acxv
-> NoteListItem x1_acxp x2_acxq x3_acxr y1_acxv x5_acxt x6_acxu)
(f_acxo x4_acxs)
{-# INLINE noteListItemLengthL #-}
noteListItemTitleL :: Lens_' NoteListItem Text
noteListItemTitleL
f_acxw
(NoteListItem x1_acxx x2_acxy x3_acxz x4_acxA x5_acxB x6_acxC)
= fmap
(\ y1_acxD
-> NoteListItem x1_acxx x2_acxy y1_acxD x4_acxA x5_acxB x6_acxC)
(f_acxw x3_acxz)
{-# INLINE noteListItemTitleL #-}
noteListItemUpdatedAtL :: Lens_' NoteListItem UTCTime
noteListItemUpdatedAtL
f_acxE
(NoteListItem x1_acxF x2_acxG x3_acxH x4_acxI x5_acxJ x6_acxK)
= fmap
(\ y1_acxL
-> NoteListItem x1_acxF x2_acxG x3_acxH x4_acxI x5_acxJ y1_acxL)
(f_acxE x6_acxK)
{-# INLINE noteListItemUpdatedAtL #-}
noteCreatedAtL :: Lens_' Note UTCTime
noteCreatedAtL
f_acx6
(Note x1_acx7 x2_acx8 x3_acx9 x4_acxa x5_acxb x6_acxc x7_acxd)
= fmap
(\ y1_acxe
-> Note x1_acx7 x2_acx8 x3_acx9 x4_acxa x5_acxb y1_acxe x7_acxd)
(f_acx6 x6_acxc)
{-# INLINE noteCreatedAtL #-}
noteHashL :: Lens_' Note Text
noteHashL
f_acxf
(Note x1_acxg x2_acxh x3_acxi x4_acxj x5_acxk x6_acxl x7_acxm)
= fmap
(\ y1_acxn
-> Note x1_acxg y1_acxn x3_acxi x4_acxj x5_acxk x6_acxl x7_acxm)
(f_acxf x2_acxh)
{-# INLINE noteHashL #-}
noteIdL :: Lens_' Note Text
noteIdL
f_acxo
(Note x1_acxp x2_acxq x3_acxr x4_acxs x5_acxt x6_acxu x7_acxv)
= fmap
(\ y1_acxw
-> Note y1_acxw x2_acxq x3_acxr x4_acxs x5_acxt x6_acxu x7_acxv)
(f_acxo x1_acxp)
{-# INLINE noteIdL #-}
noteLengthL :: Lens_' Note Int
noteLengthL
f_acxx
(Note x1_acxy x2_acxz x3_acxA x4_acxB x5_acxC x6_acxD x7_acxE)
= fmap
(\ y1_acxF
-> Note x1_acxy x2_acxz x3_acxA x4_acxB y1_acxF x6_acxD x7_acxE)
(f_acxx x5_acxC)
{-# INLINE noteLengthL #-}
noteTextL :: Lens_' Note Text
noteTextL
f_acxG
(Note x1_acxH x2_acxI x3_acxJ x4_acxK x5_acxL x6_acxM x7_acxN)
= fmap
(\ y1_acxO
-> Note x1_acxH x2_acxI x3_acxJ y1_acxO x5_acxL x6_acxM x7_acxN)
(f_acxG x4_acxK)
{-# INLINE noteTextL #-}
noteTitleL :: Lens_' Note Text
noteTitleL
f_acxP
(Note x1_acxQ x2_acxR x3_acxS x4_acxT x5_acxU x6_acxV x7_acxW)
= fmap
(\ y1_acxX
-> Note x1_acxQ x2_acxR y1_acxX x4_acxT x5_acxU x6_acxV x7_acxW)
(f_acxP x3_acxS)
{-# INLINE noteTitleL #-}
noteUpdatedAtL :: Lens_' Note UTCTime
noteUpdatedAtL
f_acxY
(Note x1_acxZ x2_acy0 x3_acy1 x4_acy2 x5_acy3 x6_acy4 x7_acy5)
= fmap
(\ y1_acy6
-> Note x1_acxZ x2_acy0 x3_acy1 x4_acy2 x5_acy3 x6_acy4 y1_acy6)
(f_acxY x7_acy5)
{-# INLINE noteUpdatedAtL #-}
-- * Suggested (Prism)
popularP :: Prism_' Suggested [Text]
popularP
= dimap (\ x_acHs -> case x_acHs of
(Popular y1_acHt) -> Right y1_acHt
_ -> Left x_acHs)
(either pure (fmap Popular)) . right'
recommendedP :: Prism_' Suggested [Text]
recommendedP
= dimap (\ x_acHv -> case x_acHv of
(Recommended y1_acHw) -> Right y1_acHw
_ -> Left x_acHv)
(either pure (fmap Recommended)) . right'

View file

@ -155,7 +155,7 @@ buildReq :: MonadIO m => String -> m Request
buildReq url = do
req <- liftIO $ parseUrl $ "https://api.pinboard.in/v1/" <> url
return $ req
{ requestHeaders = [("User-Agent","pinboard.hs/0.9.2")]
{ requestHeaders = [("User-Agent","pinboard.hs/0.9.3")]
, checkStatus = \_ _ _ -> Nothing
}