Skip to content

Instantly share code, notes, and snippets.

View mheiber's full-sized avatar

Max Heiber mheiber

View GitHub Profile
(* from https://okmij.org/ftp/ML/first-class-modules/ *)
module Eq = struct
type ('a,'b) eq = Refl of 'a option ref * 'b option ref
let refl () = let r = ref None in Refl (r,r)
let symm : ('a,'b) eq -> ('b,'a) eq = function
Refl (x,y) -> Refl (y,x)
#!/usr/bin/env ocaml
module type HdArg = sig
type t
val x: t list
val continuation : t -> unit
end
let hd (module M : HdArg): unit =
let fn : M.t list -> M.t = function
def hole_is_a_variable():
_ = 'hello'
print(_) # 'hello'
def hole_is_not_a_variable():
match 'hello':
case _:
print(_) # NameError
hole_is_a_variable()
Max Heiber
I'm implementing IDE support for a language using Language Server Protocol.
I want to trigger a rename after extracting a variable into the current scope. That is, I've implemented steps 1 to 2 of the current flow and want to know how to implement 3 and 4
1. When the user selects an expression a yellow lightbulb shows up. Example: `z = 3 + /*selection-start*/5000/*selection-end*/`
2. When the user selects "extract into variable" then a new variable called "placeholder" is created in the current scope and the original expression is assigned to it. Example: `placeholder = 5000; z = 3 + placeholder`
3. The first instance of `placeholder` is highlighted and the text box for renaming pops up. When the user types "the_new_name" and presses `Return` then the text is: `the_new_name = 5000; z = 3 + the_new_name`
"use strict";
function fetch(uri) {
throw new Error("synchronous");
}
function sync() {
return fetch('http://stuff');
}
module type Univ = sig
type t
val embed: unit -> ('a -> t) * (t -> 'a option)
end
module U1 = struct
type t = exn
let embed (type a) () =
let open struct
exception E of a
type (_, _) eq = Eq: ('a, 'a) eq
module M: sig
type t
type u
val tx: t
val ux: u
val eq_t_int: (t, int) eq
val eq_int_u: (int, u) eq
end = struct
@mheiber
mheiber / vector.ml
Last active February 27, 2023 21:49
vector ocaml dependent vector
type zero = unit * unit
type 'a minus1 = 'snd constraint 'a = unit * 'snd
type 'a plus1 = unit * 'a
type _ lst =
| [] : zero lst
| ( :: ) : int * 'b lst -> ('b lst) plus1 lst
let cons n lst = n :: lst
(* run like this: ocamlc unix.cma par.ml && ./a.out *)
open StdLabels
let par_iter (items: 'i list) ~(f: 'i -> unit): unit =
let orig_pid = Unix.getpid () in
let rec loop pids = function
| [] -> pids
| h :: t ->
match Unix.fork () with
| 0 -> f h; pids
@mheiber
mheiber / toggle.vim
Last active November 10, 2022 00:01
" usage: \b toggles the file browser, open to the directory containing the current file
nnoremap <leader>b :call ToggleNERDTree()<Cr>
function! ToggleNERDTree()
if !g:NERDTree.ExistsForTab() || !g:NERDTree.IsOpen()
if <SID>WindowFileExists()
:NERDTreeFind
else
let cwd = getcwd()