{-# 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'
{-# INLINE popularP #-}
      

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' 
{-# INLINE recommendedP #-}