Hi all,
I’m getting stuck on a very stupid thing - but I’m not really finding a way around it.
Suppose I have this very simple class
class Container(T)
@comparison_function : (T,T) -> Int32
# in future, pass a comparison function to determine how to manage
#def initialize(&comparison_function : (T, T) -> Int32)
# @comparison_function = comparison_function
#end
def initialize
{% raise "TypeError: #{@type.stringify} only accepts comparable entities or a sorting function." unless T <= Comparable %}
@comparison_function = ->(a : T, b : T) { a <=> b }
end
end
Basically, you create a Container and then the comparison function is set automatically to the <=> operator defined in container.
Except that it doesn’t compile when I try to do something like
Container(String).new
Container(Float64).new
Compile error is:
Error: instance variable '@comparison_function' of Container(String) must be Proc(String, String, (Int32 | Nil)), not Proc(String, String, Int32)
But if I remove the nullable in the definition of the comparison function I get:
Error: instance variable '@comparison_function' of Container(Float64) must be Proc(Float64, Float64, Int32), not Proc(Float64, Float64, (Int32 | Nil))
Which makes kind of sense looking at the source code (comparison with NaN should return nil) but it actually freezes me in the loop. 
Any suggestions on how to proceed?
The only way around it that I can think of is changing the implementation from
@comparison_function = ->(a : T, b : T) { a <=> b }
to
@comparison_function = ->(a : T, b : T) { a <=> b || Int32::Max}
But it’s really a meh-ing solution…
Any better options?