hindent-5.0.1: TESTS.md
# Introduction
This file is a test suite. Each section maps to an HSpec test, and
each line that is followed by a Haskell code fence is tested to make
sure re-formatting that code snippet produces the same result.
You can browse through this document to see what HIndent's style is
like, or contribute additional sections to it, or regression tests.
# Modules
Module header
``` haskell
module X where
```
Exports
``` haskell
module X
(x
,y
,Z
,P(x, z))
where
```
## Imports
Import lists
``` haskell
import Data.Text
import Data.Text
import qualified Data.Text as T
import qualified Data.Text (a, b, c)
import Data.Text (a, b, c)
import Data.Text hiding (a, b, c)
```
# Declarations
Type declaration
``` haskell
type EventSource a = (AddHandler a, a -> IO ())
```
# Expressions
Lazy patterns in a lambda
``` haskell
f = \ ~a -> undefined -- \~a yields parse error on input ‘\~’
```
Bang patterns in a lambda
``` haskell
f = \ !a -> undefined -- \!a yields parse error on input ‘\!’
```
List comprehensions
``` haskell
defaultExtensions =
[ e
| e@EnableExtension {} <- knownExtensions ] \\
map EnableExtension badExtensions
```
Record indentation
``` haskell
getGitProvider :: EventProvider GitRecord ()
getGitProvider =
EventProvider
{ getModuleName = "Git"
, getEvents = getRepoCommits
}
```
Records again
``` haskell
commitToEvent :: FolderPath -> TimeZone -> Commit -> Event.Event
commitToEvent gitFolderPath timezone commit =
Event.Event
{ pluginName = getModuleName getGitProvider
, eventIcon = "glyphicon-cog"
, eventDate = localTimeToUTC timezone (commitDate commit)
}
```
Cases
``` haskell
strToMonth :: String -> Int
strToMonth month =
case month of
"Jan" -> 1
"Feb" -> 2
_ -> error $ "Unknown month " ++ month
```
Operators
``` haskell
x =
Value <$> thing <*> secondThing <*> thirdThing <*> fourthThing <*>
Just thisissolong <*>
Just stilllonger
```
# Type signatures
Class constraints
``` haskell
fun
:: (Class a, Class b)
=> a -> b -> c
```
Tuples
``` haskell
fun :: (a, b, c) -> (a, b)
```
# Function declarations
Where clause
``` haskell
sayHello :: IO ()
sayHello = do
name <- getLine
putStrLn $ greeting name
where
greeting name = "Hello, " ++ name ++ "!"
```
Guards and pattern guards
``` haskell
f :: Int
f x
| x <- Just x
, x <- Just x =
case x of
Just x -> e
| otherwise = do e
where
x = y
```
Case inside a `where` and `do`
``` haskell
g x =
case x of
a -> x
where
foo =
case x of
_ -> do
launchMissiles
where
y = 2
```
Let inside a `where`
``` haskell
g x =
let x = 1
in x
where
foo =
let y = 2
z = 3
in y
```
# Behaviour checks
Unicode
``` haskell
α = γ * "ω" -- υ
```
Empty module
``` haskell
```