{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeFamilies #-}

module Text.Pandoc.Z.ReaderOptions(
  HasReaderOptions(..)
, AsReaderOptions(..)
, HasTrackChanges(..)
, AsTrackChanges(..)
, ReaderOptions(ReaderOptions)
, defaultReaderOptions
) where

import Control.Lens ( prism', Lens', Prism' )
import Data.Set ( Set )
import qualified Data.Set as Set
import Data.Text ( Text )
import qualified Data.Text as Text
import Text.Pandoc.Options(ReaderOptions(ReaderOptions), TrackChanges(..))

class HasReaderOptions a where
  readerOptions ::
    Lens' a ReaderOptions
  standalone ::
    Lens' a Bool
  standalone =
    (ReaderOptions -> f ReaderOptions) -> a -> f a
forall a. HasReaderOptions a => Lens' a ReaderOptions
Lens' a ReaderOptions
readerOptions ((ReaderOptions -> f ReaderOptions) -> a -> f a)
-> ((Bool -> f Bool) -> ReaderOptions -> f ReaderOptions)
-> (Bool -> f Bool)
-> a
-> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Bool -> f Bool) -> ReaderOptions -> f ReaderOptions
forall a. HasReaderOptions a => Lens' a Bool
Lens' ReaderOptions Bool
standalone
  indentedCodeClasses ::
    Lens' a [Text]
  indentedCodeClasses =
    (ReaderOptions -> f ReaderOptions) -> a -> f a
forall a. HasReaderOptions a => Lens' a ReaderOptions
Lens' a ReaderOptions
readerOptions ((ReaderOptions -> f ReaderOptions) -> a -> f a)
-> (([Text] -> f [Text]) -> ReaderOptions -> f ReaderOptions)
-> ([Text] -> f [Text])
-> a
-> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Text] -> f [Text]) -> ReaderOptions -> f ReaderOptions
forall a. HasReaderOptions a => Lens' a [Text]
Lens' ReaderOptions [Text]
indentedCodeClasses
  abbreviations ::
    Lens' a (Set Text)
  abbreviations =
    (ReaderOptions -> f ReaderOptions) -> a -> f a
forall a. HasReaderOptions a => Lens' a ReaderOptions
Lens' a ReaderOptions
readerOptions ((ReaderOptions -> f ReaderOptions) -> a -> f a)
-> ((Set Text -> f (Set Text)) -> ReaderOptions -> f ReaderOptions)
-> (Set Text -> f (Set Text))
-> a
-> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Set Text -> f (Set Text)) -> ReaderOptions -> f ReaderOptions
forall a. HasReaderOptions a => Lens' a (Set Text)
Lens' ReaderOptions (Set Text)
abbreviations
  defaultImageExtension ::
    Lens' a Text
  defaultImageExtension =
    (ReaderOptions -> f ReaderOptions) -> a -> f a
forall a. HasReaderOptions a => Lens' a ReaderOptions
Lens' a ReaderOptions
readerOptions ((ReaderOptions -> f ReaderOptions) -> a -> f a)
-> ((Text -> f Text) -> ReaderOptions -> f ReaderOptions)
-> (Text -> f Text)
-> a
-> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> f Text) -> ReaderOptions -> f ReaderOptions
forall a. HasReaderOptions a => Lens' a Text
Lens' ReaderOptions Text
defaultImageExtension
  stripComments ::
    Lens' a Bool
  stripComments =
    (ReaderOptions -> f ReaderOptions) -> a -> f a
forall a. HasReaderOptions a => Lens' a ReaderOptions
Lens' a ReaderOptions
readerOptions ((ReaderOptions -> f ReaderOptions) -> a -> f a)
-> ((Bool -> f Bool) -> ReaderOptions -> f ReaderOptions)
-> (Bool -> f Bool)
-> a
-> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Bool -> f Bool) -> ReaderOptions -> f ReaderOptions
forall a. HasReaderOptions a => Lens' a Bool
Lens' ReaderOptions Bool
stripComments

instance HasReaderOptions ReaderOptions where
  readerOptions :: Lens' ReaderOptions ReaderOptions
readerOptions =
    (ReaderOptions -> f ReaderOptions)
-> ReaderOptions -> f ReaderOptions
forall a. a -> a
id
  standalone :: Lens' ReaderOptions Bool
standalone Bool -> f Bool
f (ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h Bool
m) =
    (Bool -> ReaderOptions) -> f Bool -> f ReaderOptions
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Bool
s' -> Extensions
-> Bool
-> Int
-> Int
-> [Text]
-> Set Text
-> Text
-> TrackChanges
-> Bool
-> ReaderOptions
ReaderOptions Extensions
e Bool
s' Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h Bool
m) (Bool -> f Bool
f Bool
s)
  indentedCodeClasses :: Lens' ReaderOptions [Text]
indentedCodeClasses [Text] -> f [Text]
f (ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h Bool
m) =
    ([Text] -> ReaderOptions) -> f [Text] -> f ReaderOptions
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\[Text]
i' -> Extensions
-> Bool
-> Int
-> Int
-> [Text]
-> Set Text
-> Text
-> TrackChanges
-> Bool
-> ReaderOptions
ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i' Set Text
a Text
g TrackChanges
h Bool
m) ([Text] -> f [Text]
f [Text]
i)
  abbreviations :: Lens' ReaderOptions (Set Text)
abbreviations Set Text -> f (Set Text)
f (ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h Bool
m) =
    (Set Text -> ReaderOptions) -> f (Set Text) -> f ReaderOptions
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Set Text
a' -> Extensions
-> Bool
-> Int
-> Int
-> [Text]
-> Set Text
-> Text
-> TrackChanges
-> Bool
-> ReaderOptions
ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a' Text
g TrackChanges
h Bool
m) (Set Text -> f (Set Text)
f Set Text
a)
  defaultImageExtension :: Lens' ReaderOptions Text
defaultImageExtension Text -> f Text
f (ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h Bool
m) =
    (Text -> ReaderOptions) -> f Text -> f ReaderOptions
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Text
g' -> Extensions
-> Bool
-> Int
-> Int
-> [Text]
-> Set Text
-> Text
-> TrackChanges
-> Bool
-> ReaderOptions
ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g' TrackChanges
h Bool
m) (Text -> f Text
f Text
g)
  stripComments :: Lens' ReaderOptions Bool
stripComments Bool -> f Bool
f (ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h Bool
m) =
    (Bool -> ReaderOptions) -> f Bool -> f ReaderOptions
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Extensions
-> Bool
-> Int
-> Int
-> [Text]
-> Set Text
-> Text
-> TrackChanges
-> Bool
-> ReaderOptions
ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h) (Bool -> f Bool
f Bool
m)

class AsReaderOptions a where
  _ReaderOptions ::
    Prism' a ReaderOptions

instance AsReaderOptions ReaderOptions where
  _ReaderOptions :: Prism' ReaderOptions ReaderOptions
_ReaderOptions =
    p ReaderOptions (f ReaderOptions)
-> p ReaderOptions (f ReaderOptions)
forall a. a -> a
id

class HasTrackChanges a where
  trackChanges ::
    Lens' a TrackChanges

instance HasTrackChanges TrackChanges where
  trackChanges :: Lens' TrackChanges TrackChanges
trackChanges =
    (TrackChanges -> f TrackChanges) -> TrackChanges -> f TrackChanges
forall a. a -> a
id

instance HasTrackChanges ReaderOptions where
  trackChanges :: Lens' ReaderOptions TrackChanges
trackChanges TrackChanges -> f TrackChanges
f (ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h Bool
m) =
    (TrackChanges -> ReaderOptions)
-> f TrackChanges -> f ReaderOptions
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\TrackChanges
h' -> Extensions
-> Bool
-> Int
-> Int
-> [Text]
-> Set Text
-> Text
-> TrackChanges
-> Bool
-> ReaderOptions
ReaderOptions Extensions
e Bool
s Int
c Int
t [Text]
i Set Text
a Text
g TrackChanges
h' Bool
m) (TrackChanges -> f TrackChanges
f TrackChanges
h)

class AsTrackChanges a where
  _TrackChanges ::
    Prism' a TrackChanges
  _AcceptChanges ::
    Prism' a ()
  _AcceptChanges =
    p TrackChanges (f TrackChanges) -> p a (f a)
forall a. AsTrackChanges a => Prism' a TrackChanges
Prism' a TrackChanges
_TrackChanges (p TrackChanges (f TrackChanges) -> p a (f a))
-> (p () (f ()) -> p TrackChanges (f TrackChanges))
-> p () (f ())
-> p a (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p () (f ()) -> p TrackChanges (f TrackChanges)
forall a. AsTrackChanges a => Prism' a ()
Prism' TrackChanges ()
_AcceptChanges
  _RejectChanges ::
    Prism' a ()
  _RejectChanges =
    p TrackChanges (f TrackChanges) -> p a (f a)
forall a. AsTrackChanges a => Prism' a TrackChanges
Prism' a TrackChanges
_TrackChanges (p TrackChanges (f TrackChanges) -> p a (f a))
-> (p () (f ()) -> p TrackChanges (f TrackChanges))
-> p () (f ())
-> p a (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p () (f ()) -> p TrackChanges (f TrackChanges)
forall a. AsTrackChanges a => Prism' a ()
Prism' TrackChanges ()
_RejectChanges
  _AllChanges ::
    Prism' a ()
  _AllChanges =
    p TrackChanges (f TrackChanges) -> p a (f a)
forall a. AsTrackChanges a => Prism' a TrackChanges
Prism' a TrackChanges
_TrackChanges (p TrackChanges (f TrackChanges) -> p a (f a))
-> (p () (f ()) -> p TrackChanges (f TrackChanges))
-> p () (f ())
-> p a (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p () (f ()) -> p TrackChanges (f TrackChanges)
forall a. AsTrackChanges a => Prism' a ()
Prism' TrackChanges ()
_AllChanges

instance AsTrackChanges TrackChanges where
  _TrackChanges :: Prism' TrackChanges TrackChanges
_TrackChanges =
    p TrackChanges (f TrackChanges) -> p TrackChanges (f TrackChanges)
forall a. a -> a
id
  _AcceptChanges :: Prism' TrackChanges ()
_AcceptChanges =
    (() -> TrackChanges)
-> (TrackChanges -> Maybe ()) -> Prism' TrackChanges ()
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      (\() -> TrackChanges
AcceptChanges)
      (\case
        TrackChanges
AcceptChanges -> () -> Maybe ()
forall a. a -> Maybe a
Just ()
        TrackChanges
_ -> Maybe ()
forall a. Maybe a
Nothing)
  _RejectChanges :: Prism' TrackChanges ()
_RejectChanges =
    (() -> TrackChanges)
-> (TrackChanges -> Maybe ()) -> Prism' TrackChanges ()
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      (\() -> TrackChanges
RejectChanges)
      (\case
        TrackChanges
RejectChanges -> () -> Maybe ()
forall a. a -> Maybe a
Just ()
        TrackChanges
_ -> Maybe ()
forall a. Maybe a
Nothing)
  _AllChanges :: Prism' TrackChanges ()
_AllChanges =
    (() -> TrackChanges)
-> (TrackChanges -> Maybe ()) -> Prism' TrackChanges ()
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      (\() -> TrackChanges
AllChanges)
      (\case
        TrackChanges
AllChanges -> () -> Maybe ()
forall a. a -> Maybe a
Just ()
        TrackChanges
_ -> Maybe ()
forall a. Maybe a
Nothing)

defaultReaderOptions ::
  ReaderOptions
defaultReaderOptions :: ReaderOptions
defaultReaderOptions =
  Extensions
-> Bool
-> Int
-> Int
-> [Text]
-> Set Text
-> Text
-> TrackChanges
-> Bool
-> ReaderOptions
ReaderOptions
    Extensions
forall a. Monoid a => a
mempty
    Bool
False
    Int
80
    Int
4
    []
    (
      [Text] -> Set Text
forall a. Ord a => [a] -> Set a
Set.fromList (
        (String -> Text) -> [String] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Text
Text.pack [
          String
"Mr.", String
"Mrs.", String
"Ms.", String
"Capt.", String
"Dr.", String
"Prof.",
          String
"Gen.", String
"Gov.", String
"e.g.", String
"i.e.", String
"Sgt.", String
"St.",
          String
"vol.", String
"vs.", String
"Sen.", String
"Rep.", String
"Pres.", String
"Hon.",
          String
"Rev.", String
"Ph.D.", String
"M.D.", String
"M.A.", String
"p.", String
"pp.",
          String
"ch.", String
"sec.", String
"cf.", String
"cp."
        ]
        )
    )
    Text
forall a. Monoid a => a
mempty
    TrackChanges
AcceptChanges
    Bool
False