Beispiel #1
0
 def encode(value):
     if value is None:
         return lib.none
     if isinstance(value, tuple) and len(value) == 1:
         return lib.some(encode_item(value[0]))
     else:
         raise TypeError(value)
Beispiel #2
0
def decode_maybe(decode_item):
    item_var = unification.var('item')
    some_pattern = lib.some(item_var)

    def decode(code):
        if code is lib.none:
            return None
        match = unification.unify(some_pattern, code)
        if not match:
            raise TypeError(code)
        return (decode_item(match[item_var]),)

    return decode
Beispiel #3
0
def decode_maybe(decode_item):
    """Decode to either None or (decode_item(...),)."""
    item_var = NVAR('item')
    some_pattern = lib.some(item_var)

    def decode(term):
        if term is lib.none:
            return None
        match = pattern.match(some_pattern, term)
        if match is None:
            raise TypeError(pretty(term))
        return (decode_item(match[item_var]),)

    return decode
Beispiel #4
0
     ],
     'encode_error': [None, (), (True,), [True, 0], True, 0, 'asdf']
 },
 ('sum', 'bool', 'num'): {
     'ok': [
         (lib.inl(lib.true), (True, True)),
         (lib.inl(lib.false), (True, False)),
         (lib.inr(lib.zero), (False, 0)),
         (lib.inr(lib.succ(lib.succ(lib.zero))), (False, 2)),
     ],
     'encode_error': [None, (), (True,), [True, 0], True, 0, 'asdf']
 },
 ('maybe', 'bool'): {
     'ok': [
         (lib.none, None),
         (lib.some(lib.true), (True,)),
         (lib.some(lib.false), (False,)),
     ],
     'encode_error': [True, False, 0, 1, 2, (), 'asdf'],
     'decode_error': [I],
 },
 ('list', 'bool'): {
     'ok': [
         (lib.nil, []),
         (lib.cons(lib.true, lib.cons(lib.false, lib.nil)), [True, False]),
     ],
     'encode_error': [None, True, False, 0, 1, 2, (), 'asdf', [[True]]],
     'decode_error': [I],
 },
 ('list', ('list', 'num')): {
     'ok': [
Beispiel #5
0

@for_each([(true, true), (false, true), (join, false), (undefined, true), (error, false), (ok, false)])
def test_enum_bool(y, expected):
    qxs = quote(lib.enum_bool)
    assert simplify(lib.enum_contains(qxs, quote(y))) == expected


# ----------------------------------------------------------------------------
# Maybe


@for_each(
    [
        (lib.none, lib.none),
        (lib.some(undefined), lib.some(undefined)),
        (lib.some(error), lib.some(error)),
        (lib.some(ok), lib.some(ok)),
        (lib.some(true), lib.some(true)),
        (lib.some(false), lib.some(false)),
        (error, error),
        (undefined, undefined),
        (ok, error),
        (join, error),
        (join_(lib.none, lib.some(undefined)), error),
        (join_(lib.some(true), lib.some(false)), lib.some(join)),
    ]
)
def test_maybe_type(x, expected):
    assert simplify(lib.maybe_type(x)) == expected
Beispiel #6
0
    (join, false),
    (undefined, true),
    (error, false),
    (ok, false),
])
def test_enum_bool(y, expected):
    qxs = quote(lib.enum_bool)
    assert simplify(lib.enum_contains(qxs, quote(y))) == expected


# ----------------------------------------------------------------------------
# Maybe

@for_each([
    (lib.none, lib.none),
    (lib.some(undefined), lib.some(undefined)),
    (lib.some(error), lib.some(error)),
    (lib.some(ok), lib.some(ok)),
    (lib.some(true), lib.some(true)),
    (lib.some(false), lib.some(false)),
    (error, error),
    (undefined, undefined),
    (ok, error),
    (join, error),
    (join_(lib.none, lib.some(undefined)), error),
    (join_(lib.some(true), lib.some(false)), lib.some(join)),
])
def test_maybe_type(x, expected):
    assert simplify(lib.maybe_type(x)) == expected