Sha256: 3ff74906d3d4d0c874fdaa8ac4c21d79e4336b91b8e8510d6bb5599015738c71

Contents?: true

Size: 1.47 KB

Versions: 13

Compression:

Stored size: 1.47 KB

Contents

require 'funkr/adt/adt'
require 'funkr/categories'

module Funkr
  module Types
    class Failable < ADT
      
      include Funkr::Categories
      
      adt :ok, :failed
      
      class << self
        alias unit ok
        alias pure ok
      end
      
      include Functor
      
      def map(&block)
        case self.const
        when :ok then
          self.class.ok(yield(*self.data))
        else self
        end
      end
      
      include Applicative
      
      def apply(to)
        self.match do |f_on|
          f_on.ok do |f|
            to.match do |t_on|
              t_on.ok {|t| self.class.ok(f.call(t)) }
              t_on.failed { to }
            end
          end
          f_on.failed { self }
        end
      end
      
      
      include Alternative
      
      def or_else(&block)
        case self.const
        when :ok then self
        else yield
        end
      end
      
      
      include Monoid
      extend Monoid::ClassMethods
      
      def mplus(m_y)
        self.match do |x_on|
          x_on.failed { m_y }
          x_on.ok do |x|
            m_y.match do |y_on|
              y_on.failed { self }
              y_on.ok {|y| self.class.ok(x.mplus(y))}
            end
          end
        end
      end
      
      
      include Monad
      extend Monad::ClassMethods
      
      def bind(&block)
        case self.const
        when :ok then yield(*self.data)
        else self
        end
      end
      
      
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
funkr-0.0.40 lib/funkr/types/failable.rb
funkr-0.0.30 lib/funkr/types/failable.rb
funkr-0.0.28 lib/funkr/types/failable.rb
funkr-0.0.27 lib/funkr/types/failable.rb
funkr-0.0.26 lib/funkr/types/failable.rb
funkr-0.0.25 lib/funkr/types/failable.rb
funkr-0.0.24 lib/funkr/types/failable.rb
funkr-0.0.23 lib/funkr/types/failable.rb
funkr-0.0.22 lib/funkr/types/failable.rb
funkr-0.0.21 lib/funkr/types/failable.rb
funkr-0.0.20 lib/funkr/types/failable.rb
funkr-0.0.19 lib/funkr/types/failable.rb
funkr-0.0.18 lib/funkr/types/failable.rb