    {-# LANGUAGE FlexibleInstances #-}
    {-# LANGUAGE OverloadedStrings #-}
    module Commonmark.Extensions.Subscript
      ( HasSubscript(..)
      , subscriptSpec )
    where
    import Commonmark.Types
    import Commonmark.Syntax
    import Commonmark.Inlines
    import Commonmark.SourceMap
    import Commonmark.Html

    subscriptSpec :: (Monad m, IsBlock il bl, IsInline il, HasSubscript il)
                  => SyntaxSpec m il bl
    subscriptSpec :: forall (m :: * -> *) il bl.
    (Monad m, IsBlock il bl, IsInline il, HasSubscript il) =>
    SyntaxSpec m il bl
    subscriptSpec = SyntaxSpec m il bl
    forall a. Monoid a => a
    mempty
      { syntaxFormattingSpecs = [
          FormattingSpec '~' True True (Just subscript) Nothing '~'
          ]
      }

    class HasSubscript a where
      subscript :: a -> a

    instance HasSubscript (Html a) where
      subscript :: Html a -> Html a
    subscript Html a
    x = Text -> Maybe (Html a) -> Html a
    forall a. Text -> Maybe (Html a) -> Html a
    htmlInline Text
    "sub" (Html a -> Maybe (Html a)
    forall a. a -> Maybe a
    Just Html a
    x)

    instance (HasSubscript i, Monoid i)
            => HasSubscript (WithSourceMap i) where
      subscript :: WithSourceMap i -> WithSourceMap i
    subscript WithSourceMap i
    x = (i -> i
    forall a. HasSubscript a => a -> a
    subscript (i -> i) -> WithSourceMap i -> WithSourceMap i
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> WithSourceMap i
    x) WithSourceMap i -> WithSourceMap () -> WithSourceMap i
    forall a b. WithSourceMap a -> WithSourceMap b -> WithSourceMap a
    forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
    <* Text -> WithSourceMap ()
    addName Text
    "subscript"