Module: L42::Monad

Extended by:
Monad
Included in:
Monad
Defined in:
lib/l42/monad.rb

Defined Under Namespace

Classes: ContractViolation

Instance Method Summary collapse

Instance Method Details

#functional_input(transformer, *args, use_params: nil) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/l42/monad.rb', line 33

def functional_input(transformer, *args, use_params: nil)
  input =
    use_params || $stdin.readlines(chomp: true)
  case transformer.(input, *args)
  in [:stdout, output]
    output
  in [:stderr, output]
    $stderr.puts(output)
    exit(-1)
  in x
    raise ContractViolation,
          "a transformer needs to return a result of type `[:stderr|:stdout, anything]`, not #{x.inspect}"
  end
end

#functional_output(transformer, *args) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/l42/monad.rb', line 21

def functional_output(transformer, *args)
  case transformer.(*args)
  in [:stdout, output]
    $stdout.puts(output)
  in [:stderr, output]
    $stderr.puts(output)
  in x
    raise ContractViolation,
          "a transformer needs to return a result of type `[:stderr|:stdout, anything]`, not #{x.inspect}"
  end
end

#interact(interactor, *args, **kwds) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
# File 'lib/l42/monad.rb', line 9

def interact(interactor, *args, **kwds)
  case interactor.($stdin.readlines(chomp: true), *args, **kwds)
  in [:stdout, output]
    $stdout.puts(output)
  in [:stderr, output]
    $stderr.puts(output)
  in x
    raise ContractViolation,
          "an interactor needs to return a result of type `[:stderr|:stdout, anything]`, not #{x.inspect}"
  end
end