Skip to content

simplistix/switcheroo

Repository files navigation

CircleCI_

Switcheroo

Efficient dispatch-based calling, that might be a switch statement in another language.

short usage

from switcheroo import Switch

switch = Switch({
    'foo': lambda x: x+1,
})

>>> switch['foo'](1) 2

>>> switch['bar'](1) Traceback (most recent call last): ... KeyError: 'bar'

from switcheroo import Switch, default

switch = Switch({
    'foo': lambda x: x+1,
    default: lambda x: x-1,
})

>>> switch['foo'](1) 2

>>> switch['bar'](1) 0

explicit usage

from switcheroo import Switch

def handle_foo(x):
    return x+1

def handle_others(x):
    return x-1

switch = Switch()
switch.register('foo', handler=handle_foo)
switch.default(handle_others)

>>> switch.lookup('foo')(1) 2

>>> switch.lookup('bar')(1) 0

>>> switch.override('foo', lambda x: x+2) >>> switch.lookup('foo')(1) 3

decorator usage

from switcheroo import Switch

switch = Switch()

@switch.handles('foo')
def handle_foo(x):
    return x+1

@switch.default
def handle_others(x):
    return x-1

>>> switch['foo'](1) 2

>>> switch['bar'](1) 0

@switch.overrides('foo')
def new_handle_foo(x):
    return x+2

>>> switch['foo'](1) 3

class helper usage

class MoarThingz(object):

    switch = Switch()

    def __init__(self, state):
        self.state = state

    @switch.handles('foo')
    def handle_foo(self, x):
        return self.state - x

    @switch.default
    def handle_foo(self, x):
        return self.state + x

    def dispatch(self, case, factor, x):
        return factor * self.switch[case](self, x)

>>> things = MoarThingz(3) >>> things.dispatch('foo', factor=1, x=1) 2 >>> things.dispatch('bar', factor=-1, x=2) -5

subclass usage

from switcheroo import Switch, handles, default

class MySwitch(Switch):

    @handles('foo')
    def handles(x):
        return x+1

    @default
    def default(x):
        return x-1

>>> MySwitch['foo'](1) 2 >>> MySwitch['bar'](1) 0

changes

2.0.0 (20 Sep 2022)

  • Drop Python 2 support.

1.1.0 (26 Nov 2020)

  • Add support for overrides.
  • Add support for more explicit usage.

1.0.0 (27 Feb 2019)

  • 100% coverage checking and automated releases.

0.2.0 (13 Dec 2018)

  • Handle subclasses when using the subclass pattern.

0.1.0 (24 Nov 2018)

  • Initial release.

About

Efficient dispatch-based calling, that might be a switch statement in another language.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages