snippet rs "raise" b
raise (${1:Not_found})
endsnippet

snippet open "open"
let open ${1:module} in
${2}
endsnippet

snippet try "try"
try ${1}
with ${2:Not_found} -> ${3:()}
endsnippet

snippet ref "ref"
let ${1} = ref ${2} in
${3}
endsnippet

snippet matchl "pattern match on a list"
match ${1:list} with
| [] -> ${2:()}
| x::xs -> ${3:()}
endsnippet

snippet matcho "pattern match on an option type"
match ${1} with
| Some(${2}) -> ${3:()}
| None -> ${4:()}
endsnippet

snippet fun "anonymous function"
(fun ${1} -> ${2})
endsnippet

snippet cc "commment"
(* ${1} *)
endsnippet

snippet let "let .. in binding"
let ${1} = ${2} in
${3}
endsnippet

snippet lr "let rec"
let rec ${1} =
  ${2}
endsnippet

snippet ife "if"
if ${1} then
  ${2}
else
  ${3}
endsnippet

snippet if "If"
if ${1} then
  ${2}
endsnippet

snippet wh "while"
while ${1} do
  ${2}
done
endsnippet

snippet for "for"
for ${1:i} = ${2:1} to ${3:10} do
  ${4}
done
endsnippet

snippet match "match"
match ${1} with
| ${2} -> ${3}
endsnippet

snippet class "class"
class ${1:name} = object
  ${2}
end
endsnippet

snippet obj "obj"
object
  ${2}
end
endsnippet

snippet Obj "object"
object (self)
  ${2}
end
endsnippet

snippet {{ "object functional update"
{< ${1} = ${2} >}
endsnippet

snippet beg "beg"
begin
  ${1}${VISUAL}
end
endsnippet

snippet ml "module instantiantion with functor"
module ${1:Mod} = ${2:Functor}(${3:Arg})
endsnippet

snippet mod "module - no signature"
module ${1:(* Name *)} = struct
  ${2}
end
endsnippet

snippet Mod "module with signature"
module ${1:(* Name *)} : ${2:(* SIG *)} = struct
  ${3}
end
endsnippet

snippet sig "anonymous signature"
sig
  ${2}
end
endsnippet

snippet sigf "functor signature or anonymous functor"
functor (${1:Arg} : ${2:ARG}) -> ${3:(* BODY *)}
endsnippet

snippet func "define functor - no signature"
module ${1:M} (${2:Arg} : ${3:ARG}) = struct
  ${4}
end
endsnippet

snippet Func "define functor - with signature"
module ${1:M} (${2:Arg} : ${3:ARG}) : ${4:SIG} = struct
  ${5}
end
endsnippet

snippet mot "Declare module signature"
module type ${1:(* Name *)} = sig
  ${2}
end
endsnippet

snippet module "Module with anonymous signature"
module ${1:(* Name *)} : sig
  ${2}
end = struct
  ${3}
end
endsnippet

snippet oo "odoc"
(** ${1} *)
endsnippet

snippet qt "inline qtest"
(*$T ${1:name}
   ${2:test}
*)
endsnippet
