Skip to content

Commit

Permalink
Merge 22e3d2d into 1d41c1e
Browse files Browse the repository at this point in the history
  • Loading branch information
Ilya Bylich committed May 30, 2013
2 parents 1d41c1e + 22e3d2d commit c890237
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 41 deletions.
44 changes: 3 additions & 41 deletions lib/naught/null_class_builder.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'naught/null_class_builder/conversions_module'

module Naught
class NullClassBuilder
# make sure this module exists
Expand Down Expand Up @@ -30,47 +32,7 @@ def null_equivalents
end

def generate_conversions_module(null_class)
null_equivs = null_equivalents # get a local binding
@conversions_module ||= Module.new do
define_method(:Null) do |object=:nothing_passed|
case object
when NullObjectTag then object
when :nothing_passed, *null_equivs
null_class.get(caller: caller(1))
else raise ArgumentError, "#{object.inspect} is not null!"
end
end

define_method(:Maybe) do |object=nil, &block|
object = block ? block.call : object
case object
when NullObjectTag then object
when *null_equivs
null_class.get(caller: caller(1))
else
object
end
end

define_method(:Just) do |object=nil, &block|
object = block ? block.call : object
case object
when NullObjectTag, *null_equivs
raise ArgumentError, "Null value: #{object.inspect}"
else
object
end
end

define_method(:Actual) do |object=nil, &block|
object = block ? block.call : object
case object
when NullObjectTag then nil
else
object
end
end
end
@conversions_module ||= ::Naught::ConversionsModule.build(null_equivalents, null_class)
end

def generate_class
Expand Down
58 changes: 58 additions & 0 deletions lib/naught/null_class_builder/conversions_module.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
module Naught

module ConversionsModule

def Null(object = :nothing_passed)
case object
when NullObjectTag then object
when :nothing_passed, *null_equivs
null_class.get(caller: caller(1))
else raise ArgumentError, "#{object.inspect} is not null!"
end
end

def Maybe(object = nil, &block)
object = block ? block.call : object
case object
when NullObjectTag then object
when *null_equivs
null_class.get(caller: caller(1))
else
object
end
end

def Just(object = nil, &block)
object = block ? block.call : object
case object
when NullObjectTag, *null_equivs
raise ArgumentError, "Null value: #{object.inspect}"
else
object
end
end

def Actual(object=nil, &block)
object = block ? block.call : object
case object
when NullObjectTag then nil
else
object
end
end

class << self

def build(null_equivs, null_class)
Module.new do
define_method(:null_equivs) { null_equivs }
define_method(:null_class) { null_class }
include ::Naught::ConversionsModule
end
end

end

end

end

0 comments on commit c890237

Please sign in to comment.