-- |Whitespace skipping quoter, internal
module Exon.SkipWs where

import Language.Haskell.TH.Quote (QuasiQuoter)

import Exon.Class.Exon (ExonString (exonWhitespace))
import Exon.Data.Result (Result (Empty))
import Exon.Quote (exonWith)

-- |Wrapping a quote type with this causes whitespace to be ignored.
--
-- @since 1.0.0.0
newtype SkipWs a =
  SkipWs a
  deriving stock (SkipWs a -> SkipWs a -> Bool
forall a. Eq a => SkipWs a -> SkipWs a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SkipWs a -> SkipWs a -> Bool
$c/= :: forall a. Eq a => SkipWs a -> SkipWs a -> Bool
== :: SkipWs a -> SkipWs a -> Bool
$c== :: forall a. Eq a => SkipWs a -> SkipWs a -> Bool
Eq, Int -> SkipWs a -> ShowS
forall a. Show a => Int -> SkipWs a -> ShowS
forall a. Show a => [SkipWs a] -> ShowS
forall a. Show a => SkipWs a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SkipWs a] -> ShowS
$cshowList :: forall a. Show a => [SkipWs a] -> ShowS
show :: SkipWs a -> String
$cshow :: forall a. Show a => SkipWs a -> String
showsPrec :: Int -> SkipWs a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> SkipWs a -> ShowS
Show, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (SkipWs a) x -> SkipWs a
forall a x. SkipWs a -> Rep (SkipWs a) x
$cto :: forall a x. Rep (SkipWs a) x -> SkipWs a
$cfrom :: forall a x. SkipWs a -> Rep (SkipWs a) x
Generic)
  deriving newtype (String -> SkipWs a
forall a. IsString a => String -> SkipWs a
forall a. (String -> a) -> IsString a
fromString :: String -> SkipWs a
$cfromString :: forall a. IsString a => String -> SkipWs a
IsString)

-- |Defined separately because TH chokes on the selector.
--
-- @since 1.0.0.0
skipWs :: SkipWs a -> a
skipWs :: forall a. SkipWs a -> a
skipWs (SkipWs a
a) =
  a
a

-- |The instance used when the result type is wrapped in 'SkipWs', which is done by 'Exon.intron'.
--
-- It returns 'Empty' for any whitespace.
instance (
    IsString builder
  ) => ExonString (SkipWs result) builder where
  exonWhitespace :: String -> Result builder
exonWhitespace String
_ =
    forall a. Result a
Empty
  {-# inline exonWhitespace #-}

-- |A variant of 'Exon.exon' that ignores all literal whitespace in the quote (not in interpolated expressions).
--
-- > [intron|x|] === skipWs [exonws|x|]
--
-- @since 1.0.0.0
intron :: QuasiQuoter
intron :: QuasiQuoter
intron =
  Maybe (Q Exp, Q Exp) -> Bool -> Bool -> QuasiQuoter
exonWith (forall a. a -> Maybe a
Just ([e|SkipWs|], [e|skipWs|])) Bool
True Bool
False