1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Chromabits\Nucleus\Support;
13:
14: use ArrayAccess;
15: use Chromabits\Nucleus\Control\Maybe;
16: use Chromabits\Nucleus\Data\Factories\ComplexFactory;
17: use Chromabits\Nucleus\Exceptions\UnknownKeyException;
18: use Chromabits\Nucleus\Foundation\BaseObject;
19: use Chromabits\Nucleus\Meditation\Arguments;
20: use Chromabits\Nucleus\Meditation\Boa;
21: use Chromabits\Nucleus\Meditation\Exceptions\InvalidArgumentException;
22: use Traversable;
23:
24: 25: 26: 27: 28: 29: 30: 31:
32: class Flick extends BaseObject
33: {
34: 35: 36:
37: protected $functions;
38:
39: 40: 41:
42: protected $default;
43:
44: 45: 46: 47: 48: 49: 50: 51: 52:
53: public function __construct($functions, $default = 'default')
54: {
55: parent::__construct();
56:
57: Arguments::define(
58: Boa::lst(),
59: Boa::either(Boa::string(), Boa::integer())
60: )->check($functions, $default);
61:
62: $this->functions = $functions;
63: $this->default = $default;
64: }
65:
66: 67: 68: 69: 70: 71: 72: 73:
74: public static function when($functions, $default = 'default')
75: {
76: return new Flick($functions, $default);
77: }
78:
79: 80: 81: 82: 83: 84: 85: 86:
87: public function go($input)
88: {
89: Arguments::define(Boa::readMap())->define($input);
90:
91: $map = ComplexFactory::toReadMap($this->functions);
92:
93: if ($map->member($input)) {
94:
95: $function = Maybe::fromJust($map->lookup($input));
96:
97: return $function();
98: } elseif ($map->member($this->default)) {
99:
100: $function = Maybe::fromJust($map->lookup($this->default));
101:
102: return $function();
103: }
104:
105: throw new UnknownKeyException();
106: }
107: }
108: