snippet fn "fn"
  fn ${1:function_name}(${2}) -> ${3:Nil} {
    ${0:${VISUAL:todo}}
  }

snippet pfn "pub fn"
  pub fn ${1:function_name}(${2}) -> ${3:Nil} {
    ${0:${VISUAL:todo}}
  }

snippet test "test fn"
  pub fn ${1:name}_test() {
    ${0}
  }

snippet af "anonymous fn"
  fn(${1}) { ${0:${VISUAL}} }

snippet let "let binding"
  let ${1} = ${0}

snippet l "let binding"
  let ${1} = ${0}

snippet as "assert binding"
  assert ${1} = ${0}

snippet tr "try binding"
  try ${1} = ${0}

snippet - "->"
  -> ${0}

snippet case "case expression"
  case ${1} {
    ${2} -> ${0}
  }

snippet ty "type"
  type ${1:Name} {
    ${0:$1}
  }

snippet pty "pub type"
  pub type ${1:Name} {
    ${0:$1}
  }

snippet tya "type alias"
  type ${1:Name} =
    ${0:$1}

snippet ptya "pub type alias"
  pub type ${1:Name} =
    ${0:$1}

snippet ext "external type"
  external type ${0}

snippet pext "pub external type"
  pub external type ${0}

snippet exfn "external fn"
  external fn ${1:function_name}(${2}) -> ${3}
    = "${4}" "${0}"

snippet pexfn "pub external fn"
  pub external fn ${1:function_name}(${2}) -> ${3}
    = "${4}" "${0}"

snippet im "import"
  import ${0:gleam/result}

snippet im. "import exposing"
  import ${1:gleam/result}.{${0}}

snippet p "|>"
  |> ${0}

snippet tup "tuple()"
  tuple(${0:${VISUAL}})

snippet bl "block"
  {
    ${0:${VISUAL}}
  }

snippet tf "fn(Type) -> Type"
  fn(${1}) -> ${0}

snippet seq "should.equal"
  should.equal(${0:${VISUAL}})

snippet strue "should.be_true"
  should.be_true(${0:${VISUAL}})

snippet sfalse "should.be_false"
  should.be_true(${0:${VISUAL}})