################################################################
# © Copyright 2011 Konstantin Gorodinskiy. All Rights Reserved.#
# Do What The Fuck You Want To Public License, Version 2.      #
# See http://sam.zoy.org/wtfpl/COPYING for more details.       #
################################################################
# Scala lang
#if
snippet if
	if (${1})
		${0:${VISUAL}}
#if not
snippet ifn
	if (!${1})
		${0:${VISUAL}}
#if-else
snippet ife
	if (${1})
		${2:${VISUAL}}
	else
		${0}
#if-else-if
snippet ifelif
	if (${1})
		${2:${VISUAL}}
	else if (${3})
		${0:${VISUAL}}
snippet eif
	else if (${3})
		${0:${VISUAL}}
#while loop
snippet wh
	while (${1:obj}) {
		${0:${VISUAL}}
	}
#for loop(classic)
snippet for
	for (${1:item} <- ${2:obj}) {
		${0}
	}
#for loop(indexed)
snippet fori
	for (${1:i} <- ${2:0} to ${3:obj}.length) {
		${0}
	}
#for comprehension
snippet fory
	for {
		${1:item} <- ${2:obj}
	} yield ${0}
#exceptions
snippet try
	try {
		${1:${VISUAL}}
	} catch {
		case e: FileNotFoundException => ${2}
		case e: IOException => ${3}
	} finally {
		${0}
	}
#match
snippet mat
	${1:${VISUAL}} match {
		case ${2} => ${0}
	}
snippet match
	${1: obj} match {
		case ${2:e} => ${3}
		case _ => ${0}
	}
#case
snippet case
	case ${1:${VISUAL}} => ${0}
############################
# methods and arguments
#
#arg
snippet arg
	${1:a}: ${2:T}${0:, arg}
#args
snippet args
	${1:args}: ${0:T}*
#def
snippet def
	def ${1:name}(${2:arg}) = ${0:}
#private def
snippet prdef
	private def ${1:name}(${2:arg}) = ${0:}
#override def
snippet ovdef
	override def ${1:name}(${2:arg}) = ${0:}
#first class function(see scalabook p 188)
snippet fcf
	(${1:a}: ${2:T}) => $1 ${0}
snippet =>
	${1:name} => ${0}
#recursion
snippet rec
	def ${1:name}(${0:arg}) =
		if($2) $2
		else $1($2)
#curried method
snippet crdef
	def ${1:name}(${2:arg})(${3:arg}) = ${0:}
#main method
#check validity of T
snippet main
	def main(args: Array[String]):${1:T} = ${0:}
############################
# basic types(general purpose)
# you might want to use basic types snippets

#1
snippet T Double
	dbl
#2
snippet T Int
	int
#3
snippet T Long
	lng
#4
snippet T Char
	chr
#5
snippet T String
	str
#6
snippet T Array
	arr
#7
snippet T Buffer
	buf
#8
snippet T List
	list
#9
snippet T Tuple
	tpl
#10
snippet T Set
	set
#11
snippet T Map
	map
#12
snippet T HashSet
	hset
#13
snippet T HashMap
	hmap
#14
snippet T Boolean
	bool
#end

#named snippets for types
snippet bool
	Boolean
snippet anyr
	AnyRef
snippet dbl
	Double
snippet int
	Int
snippet str
	String
snippet chr
	Char
snippet lng
	Long
snippet arr
	Array${1:[T]}${0:()}
snippet buf
	Buffer${1:[T]}${0:()}
snippet list
	List${1:[T]}${0:()}
snippet tpl
	Tuple${1:2}[${2:T},${0:T}]
snippet set
	Set${1:[T]}${0:()}
snippet hset
	HashSet${1:[T]}${0:()}
snippet mhset
	mutable.HashSet${1:[T]}${0:()}
#for maps
snippet keyval
	${1:key}->${2:val}${0:, keyval}
snippet map
	Map[${1:T},${2:T}]${0:(keyval)}
snippet hmap
	HashMap[${1:T},${2:T}]${0:(keyval)}
snippet mmap
	mutable.Map[${1:T},${2:T}]${0:(keyval)}
snippet mhmap
	mutable.HashMap[${1:T},${2:T}]${0:(keyval)}
#TODO add TreeMap and TreeSet
#asInstanceOf[]
snippet as
	${1:name}.asInstanceOf[${2:T}]
#isInstanceOf[]
snippet is
	${1:name}.isInstanceOf[${2:T}]

#collections methods

#scope() with one arg
snippet (a
	(${1:a} => ${0})
#scope() with two args
snippet {(
	{(${1:a},${2:b}) =>
		${0}
	}
#filter
snippet filter
	${0:name}.filter (a
#map function
snippet mapf
	${0:name}.map (a
#flatmap
snippet flatmap
	${1:name}.flatMap${0:[T]}(a
#fold left
snippet fldl
	${1:name}.foldLeft(${0:first}) {(
#fold right
snippet fldr
	${1:name}.foldRight(${0:first}) {(
#fold left operator(if u wanna reduce readability of ur code)
#use wildcard symbols
snippet /:
	(${1:first}/:${2:name})(${0})
#fold right operator
snippet :\
	(${1:first}:\${2:name})(${0})
#reduce left
snippet redl
	${1:name}.reduceLeft[${0:T}] {(
#reduce right
snippet redr
	${1:name}.reduceRight[${0:T}] {(
#zipWithIndex(safe way).
#see http://daily-scala.blogspot.com/2010/05/zipwithindex.html
snippet zipwi
	${0:name}.view.zipWithIndex
#split
snippet spl
	${1:name}.split("${0:,}")
#end
snippet val
	val ${1:name}${2:: T} = ${0:value}
snippet var
	var ${1:name}${2:: T} = ${0:value}
############################
# classes
#
#extends
snippet extends
	extends ${0:what}
#with
snippet with
	with ${1:what}${0: with}
#auxiliary constructor(a. this)
snippet athis
	def this(arg) = this(arg)
#abstract class
snippet abstract
	abstract class ${1:name}${2:(arg)}${3: extends }${4: with} {
		${5:override def toString = "$1"}
		${0}
	}
#class
snippet class
	class ${1:name}${2:(arg)}${3: extends }${4: with} {
		${5:override def toString = "$1"}
		${0}
	}
#object
snippet object
	object ${1:name}${2:(arg)}${3: extends }${4: with} ${0:}
#trait
snippet trait
	trait ${1:name}${2: extends }${3: with} {
		${0:}
	}
#class with trait Ordered(page 265)
snippet ordered
	class ${1:name}${2:(arg)} extends Ordered[$1] ${3: with} {
		${4:override def toString = "$1"}
		def compare(that: $1) = ${5:this - that}
		${0}
	}
#case class
snippet casecl
	case class ${1:name}${2:(arg)}${3: extends }${4: with} ${0:}
############################
# testing
#
#scalatest imports
snippet scalatest
	${1:import org.scalatest.Suite}
	${0:import org.scalatest.FunSuite}
#assert
snippet assert
	assert(${1:a} === ${0:b})
#ensuring(p 296)
snippet ensuring
	ifel ensuring(${1:a}==${0:b})
#expect
snippet expect
	expect(${1:what}) {
		${0}
	}
#intercept
snippet intercept
	intercept[${1:IllegalArgumentException}] {
		${0}
	}
#test
snippet test
	test("${1:description}") {
		${0}
	}
#suite
snippet suite
	class ${0:name} extends Suite {
		def test() {
	}
#funsuite
snippet fsuite
	class ${1:name} extends FunSuite {
		test("${0:description}") {
	}
############################
# SBT
#
snippet webproject
	import sbt._

	class ${1:Name}(info: ProjectInfo) extends DefaultWebProject(info) {
		val liftVersion = "${0:2.3}"

		override def libraryDependencies = Set(

		) ++ super.libraryDependencies

		val snapshots = ScalaToolsSnapshots
	}
#depencies
snippet liftjar
	"net.liftweb" %% "${0:lib}" % liftVersion % "compile->default",
snippet jettyjar
	"org.mortbay.jetty" % "jetty" % "${0:version}" % "test->default",
############################
# Lift
#
#lift imports
snippet liftimports
	import _root_.net.liftweb.http._
	import S._
	import _root_.net.liftweb.util._
	import Helpers._
	import _root_.scala.xml._
#TODO LIFT,SBT,WEB.XML,HTML snippets