| 
									
										
										
										
											2020-01-11 20:15:05 +00:00
										 |  |  | {-# LANGUAGE TemplateHaskell #-} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 23:08:58 +00:00
										 |  |  | {-|
 | 
					
						
							|  |  |  | Module      : GHCup.Utils.String.QQ | 
					
						
							|  |  |  | Description : String quasi quoters | 
					
						
							|  |  |  | Copyright   : (c) Audrey Tang <audreyt@audreyt.org> 2019, Julian Ospald <hasufell@posteo.de> 2020 | 
					
						
							| 
									
										
										
										
											2020-07-30 18:04:02 +00:00
										 |  |  | License     : LGPL-3.0 | 
					
						
							| 
									
										
										
										
											2020-07-21 23:08:58 +00:00
										 |  |  | Maintainer  : hasufell@hasufell.de | 
					
						
							|  |  |  | Stability   : experimental | 
					
						
							| 
									
										
										
										
											2021-05-14 21:09:45 +00:00
										 |  |  | Portability : portable | 
					
						
							| 
									
										
										
										
											2020-07-21 23:08:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | QuasiQuoter for non-interpolated strings, texts and bytestrings. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The "s" quoter contains a multi-line string with no interpolation at all, | 
					
						
							|  |  |  | except that the leading newline is trimmed and carriage returns stripped. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @ | 
					
						
							|  |  |  | {-\# LANGUAGE QuasiQuotes #-} | 
					
						
							|  |  |  | import Data.Text (Text) | 
					
						
							|  |  |  | import Data.String.QQ | 
					
						
							|  |  |  | foo :: Text -- "String", "ByteString" etc also works | 
					
						
							|  |  |  | foo = [s| | 
					
						
							|  |  |  | Well here is a | 
					
						
							|  |  |  |     multi-line string! | 
					
						
							|  |  |  | |] | 
					
						
							|  |  |  | @ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Any instance of the IsString type is permitted. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (For GHC versions 6, write "[$s||]" instead of "[s||]".) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -} | 
					
						
							| 
									
										
										
										
											2020-01-11 20:15:05 +00:00
										 |  |  | module GHCup.Utils.String.QQ | 
					
						
							|  |  |  |   ( s | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | where | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import           Data.Char | 
					
						
							|  |  |  | import           GHC.Exts                       ( IsString(..) ) | 
					
						
							|  |  |  | import           Language.Haskell.TH.Quote | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -- | QuasiQuoter for a non-interpolating ASCII IsString literal. | 
					
						
							|  |  |  | -- The pattern portion is undefined. | 
					
						
							|  |  |  | s :: QuasiQuoter | 
					
						
							|  |  |  | s = QuasiQuoter | 
					
						
							|  |  |  |   (\s' -> case and $ fmap isAscii s' of | 
					
						
							|  |  |  |     True  -> (\a -> [|fromString a|]) . trimLeadingNewline . removeCRs $ s' | 
					
						
							|  |  |  |     False -> fail "Not ascii" | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  |   (error "Cannot use q as a pattern") | 
					
						
							|  |  |  |   (error "Cannot use q as a type") | 
					
						
							|  |  |  |   (error "Cannot use q as a dec") | 
					
						
							|  |  |  |  where | 
					
						
							|  |  |  |   removeCRs = filter (/= '\r') | 
					
						
							|  |  |  |   trimLeadingNewline ('\n' : xs) = xs | 
					
						
							|  |  |  |   trimLeadingNewline xs          = xs | 
					
						
							|  |  |  | 
 |