def test_traverse_some(self): xs = toLinkedList([1, 2, 3]) def add1A(x): return some(x + 1) self.assertEqual(Option.traverse(add1A, xs), some(toLinkedList([2, 3, 4])))
def test_functor_associativity_law(self): a = some(1) def f(x): return x + 1 def g(x): return x * 2 self.assertEqual(a.map(f).map(g), a.map(f | andThen | g))
def test_ap(self): def add(x): return lambda y: x + y self.assertEqual(some(add).ap(some(1)).ap(some(2)), some(3)) self.assertEqual(some(add).ap(nothing).ap(some(2)), nothing)
def test_map(self): def f(x): return x + 1 self.assertEqual(some(1).map(f), some(2)) self.assertEqual(nothing.map(f), nothing)
def test_functor_identity_law(self): a = some(1) self.assertEqual(identity(a), a.map(identity)) self.assertEqual(identity(nothing), nothing.map(identity))
def test_isSome(self): self.assertFalse(nothing.isSome()) self.assertTrue(some(1).isSome())
def oddA(x): if x % 2 == 1: return some(x) else: return nothing
def add1A(x): return some(x + 1)
def test_sequence_nothing(self): self.assertEqual( Option.sequence(toLinkedList([some(1), nothing, some(3)])), nothing)
def test_sequence_some(self): xs = toLinkedList([some(1), some(2), some(3)]) self.assertEqual(Option.sequence(xs), some(toLinkedList([1, 2, 3])))
def test_fold(self): def toStr(a, z): return str(a) + ", " + z self.assertEqual(some(1).fold(toStr, "0"), "1, 0") self.assertEqual(nothing.fold(toStr, "0"), "0")
def test_eq_some(self): self.assertEqual(some(1), some(1)) self.assertNotEqual(some(0), some(1))
def add1M(x): return some(x + 1)
def test_bind(self): def add1M(x): return some(x + 1) self.assertEqual(some(2).bind(add1M), some(3)) self.assertEqual(nothing.bind(add1M), nothing)