Module: Fr::Monoid

Included in:
Additive, Array, Either, Maybe, Multiplicative, String
Defined in:
lib/fr/monoid.rb

Instance Method Summary collapse

Instance Method Details

#filter(f, ma = nil) ⇒ Object

Monad m, Monoid m => (a -> Bool) -> m a -> m a

>> m.filter(lambda{|x| x.odd? }).call(m.unit(10))

> m.zero

Not supported: >> m.unit(10).filter{|x| x.odd? }

> m.zero



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/fr/monoid.rb', line 38

def filter(f, ma = nil)
  rest =
    lambda do |ma|
      bind(ma) do |a|
        f.call(a) ?
          unit(a) : zero
      end
    end

  (ma.nil?) ?
    rest : rest.call(ma)
end

#guard(bool) ⇒ Object

Monad m, Monoid m => Bool -> m ()

>> m.guard(false)

> m.zero

Not supported: >> true.guard(m.unit(x))

> m.unit(x)



24
25
26
27
# File 'lib/fr/monoid.rb', line 24

def guard(bool)
  bool ?
    unit(nil) : zero
end

#sum(ms) ⇒ Object

Monoid m => [m] -> m

>> [m.unit(1), m.unit(2)].sum

> m.plus(m.plus(m.zero, m.unit(1)), m.unit(2))



11
12
13
# File 'lib/fr/monoid.rb', line 11

def sum(ms)
  ms.inject(zero){|sum,m| plus(sum, m) }
end