{-# 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 #-}