Sat Feb 19 2022
Simple version with shallow copy only:
module ImmutableArray: {
type t<'a>
let make: unit => t<'a>
let push: (t<'a>, 'a) => t<'a>
} = {
type t<'a> = array<'a>
let make = () => []
let push = (arr, value) => Belt.Array.concat(arr, [value])
}
let arr0: ImmutableArray.t<int> = ImmutableArray.make()
let arr1 = ImmutableArray.push(arr0, 1)
Js.log(arr0 === arr0) // true
Js.log(arr0 === arr1) // false