{-# LANGUAGE NamedFieldPuns #-}
{-# OPTIONS_GHC -fno-warn-missing-fields #-}

module Data.String.Here.Internal (trim, quoteDependentFile) where

import Data.Char

import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax

trim :: String -> String
trim :: String -> String
trim = String -> String
trimTail (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace

trimTail :: String -> String
trimTail :: String -> String
trimTail "" = ""
trimTail s :: String
s = Int -> String -> String
forall a. Int -> [a] -> [a]
take (String -> Int
lastNonBlank String
s) String
s
  where lastNonBlank :: String -> Int
lastNonBlank = (Int -> Int -> Int
forall a. Num a => a -> a -> a
+1) (Int -> Int) -> (String -> Int) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> Int
forall a b. (a, b) -> a
fst ((Int, Int) -> Int) -> (String -> (Int, Int)) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Int) -> Char -> (Int, Int))
-> (Int, Int) -> String -> (Int, Int)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (Int, Int) -> Char -> (Int, Int)
forall a. Num a => (a, a) -> Char -> (a, a)
acc (0, 0)
        acc :: (a, a) -> Char -> (a, a)
acc (l :: a
l, n :: a
n) c :: Char
c | Char -> Bool
isSpace Char
c = (a
l, a
n a -> a -> a
forall a. Num a => a -> a -> a
+ 1)
                     | Bool
otherwise = (a
n, a
n a -> a -> a
forall a. Num a => a -> a -> a
+ 1)

quoteDependentFile :: QuasiQuoter -> QuasiQuoter
quoteDependentFile :: QuasiQuoter -> QuasiQuoter
quoteDependentFile QuasiQuoter {String -> Q Exp
quoteExp :: QuasiQuoter -> String -> Q Exp
quoteExp :: String -> Q Exp
quoteExp} =
  QuasiQuoter :: (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter
    { quoteExp :: String -> Q Exp
quoteExp = \filename :: String
filename -> do String -> Q ()
addDependentFile String
filename
                                 IO String -> Q String
forall a. IO a -> Q a
runIO (String -> IO String
readFile String
filename) Q String -> (String -> Q Exp) -> Q Exp
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> Q Exp
quoteExp
    }