summaryrefslogtreecommitdiffstats
path: root/player/mruby/either.mrb
blob: becec6c9615abc207b692a8b16443f603fd49d56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
module M
  class ReplyError < StandardError; end

  class Either
    def initialize(value)
      @value = value
    end

    def to_s
      "#<#{self.class.name} value=#{@value}>"
    end
  end

  class Left < Either
    def map(&block)
      self
    end

    def get_or_else(value)
      value
    end

    def get!
      raise ReplyError, @value
    end

    def success?
      false
    end
  end

  class Right < Either
    def map(&block)
      Right.new(block.call(@value))
    end

    def get_or_else(_value)
      @value
    end

    def get!
      @value
    end

    def success?
      true
    end
  end
end