snippet lang
	{-# LANGUAGE ${0:OverloadedStrings} #-}
snippet haddock
	{-# OPTIONS_HADDOCK ${0:hide} #-}
snippet ghc
	{-# OPTIONS_GHC ${0:-fno-warn-unused-imports} #-}
snippet inline
	{-# INLINE ${0:name} #-}
snippet info
	-- |
	-- Module      :  ${1:`substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')`}
	-- Copyright   :  ${2:Author} ${3:2011-2012}
	-- License     :  ${4:BSD3}
	--
	-- Maintainer  :  ${5:email@something.com}
	-- Stability   :  ${6:experimental}
	-- Portability :  ${7:unknown}
	--
	-- ${0:Description}
	--
snippet imp
	import ${0:Data.Text}
snippet import
	import           ${0:Data.Text}
snippet import2
	import           ${1:Data.Text} (${0:head})
snippet impq
	import qualified ${1:Data.Text} as ${0:T}
snippet importq
	import qualified ${1:Data.Text} as ${0:T}
snippet inst
	instance ${1:Monoid} ${2:Type} where
		${0}
snippet type
	type ${1:Type} = ${0:Type}
snippet data
	data ${1:Type} = ${2:$1} ${0:Int}
snippet newtype
	newtype ${1:Type} = ${2:$1} ${0:Int}
snippet class
	class ${1:Class} a where
		${0}
snippet module
	module `substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')` (
	) where
	`expand('%') =~ 'Main' ? "\nmain :: IO ()\nmain = undefined" : ""`

snippet main
	main :: IO ()
	main = ${0:undefined}
snippet const
	${1:name} :: ${2:a}
	$1 = ${0:undefined}
snippet fn
	${1:fn} :: ${2:a} -> ${3:a}
	$1 ${4} = ${0:undefined}
snippet fn2
	${1:fn} :: ${2:a} -> ${3:a} -> ${4:a}
	$1 ${5} = ${0:undefined}
snippet fn3
	${1:fn} :: ${2:a} -> ${3:a} -> ${4:a} -> ${5:a}
	$1 ${6} = ${0:undefined}
snippet => "Type constraint"
	(${1:Class} ${2:a}) => $2
snippet ap
	${1:map} ${2:fn} ${0:list}
snippet \
	\\${1:x} -> ${0:expression}
snippet (\
	(\\${1:x} -> ${0:expression})
snippet <-
	${1:a} <- ${0:m a}
snippet ->
	${1:m a} -> ${0:a}
snippet tup
	(${1:a}, ${0:b})
snippet tup2
	(${1:a}, ${2:b}, ${0:c})
snippet tup3
	(${1:a}, ${2:b}, ${3:c}, ${0:d})
snippet rec
	${1:Record} { ${2:recFieldA} = ${3:undefined}
				, ${4:recFieldB} = ${0:undefined}
				}
snippet case
	case ${1:something} of
		${2} -> ${0}
snippet let
	let ${1} = ${2}
	in ${3}
snippet where
	where
		${1:fn} = ${0:undefined}
snippet spec
	module `substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')` (main, spec) where

	import Test.Hspec
	import Test.QuickCheck

	main :: IO ()
	main = hspec spec

	spec :: Spec
	spec =
		describe "${1}" $ do
			$0
snippet desc
	describe "${1}" $ do
		$0
snippet it
	it "${1}" $
		$0
snippet itp
	it "${1}" $ property $
		$0
