Skip to content

Instantly share code, notes, and snippets.

let state = ref 0;;
(!): ‘a ref -> ‘a
!state;;
(:=) : ‘a ref -> ‘a -> unit
state := 1;;
@SteveGilham
SteveGilham / gist:3a42599c9e6c7eca0e69
Created April 26, 2015 13:39
Mutable reference type example
type 'a Ref = { mutable value : 'a }
let (!) (r : 'a Ref) = r.value
let (:=) (r : 'a Ref) (v:'a) = r.value <- v;;
@SteveGilham
SteveGilham / gist:a2ff2b0d3a4c3342b3d3
Created April 26, 2015 13:38
Local persistent state
let gen f =
let i = ref 0
fun () -> (i := !i + 1; f !i);;
let sq x = x*x;;
let g = gen sq;;
let hd (x::xs) = x;;
let tl (x::xs) = xs;;
@SteveGilham
SteveGilham / gist:f5d636c828125d792933
Created April 26, 2015 13:36
Queue with shared mutable state
let stream init =
let state = ref init
let put x = (state := (!state)@[x])
let get () = let r = hd !state
state := tl !state
r
let isEmpty () = !state = []
(put, get, isEmpty);;
let spawn f = (new Thread(new ThreadStart(f))).Start();;
let getLock () = new ReaderWriterLock();;
let acquireWrite (lock:ReaderWriterLock) = lock.AcquireWriterLock(-1);;
let releaseWrite (lock:ReaderWriterLock) = lock.ReleaseWriterLock();;
let acquireRead (lock:ReaderWriterLock) = lock.AcquireReaderLock(-1);;
let releaseRead (lock:ReaderWriterLock) = lock.ReleaseReaderLock();;
let upgrade (lock:ReaderWriterLock) = lock.UpgradeToWriterLock(-1);;
let downgrade (lock:ReaderWriterLock) cookie = lock.DowngradeFromWriterLock(cookie);;