Skip to content

Reader

Reader dataclass

Bases: Generic[R, A]

Reader is a monad.

Source code in funclift/types/reader.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
@dataclass
class Reader(Generic[R, A]):
    """Reader is a monad."""

    action: Callable[[R], A]
    # data Reader cfg a = Reader { runReader :: cfg -> a }

    @staticmethod
    def pure(b: B) -> Reader[R, B]:
        def new_action(r: R) -> B:
            return b
        return Reader(new_action)

    # @staticmethod
    # def asks(f: Callable[[R], B]) -> Reader[R, B]:
    #     return Reader(f)

    @staticmethod
    def ask() -> Reader[R, R]:
        def new_action(r: R) -> R:
            return r
        return Reader(new_action)

    def fmap(self, f: Callable[[A], B]) -> Reader[R, B]:
        def new_action(r: R) -> B:
            a = self.action(r)
            return f(a)
        return Reader(new_action)

    # def ap(self: Reader[Callable[[C], E]], other: Reader[C]) -> Reader[E]:
    #     return other.fmap(self.action)

    # def ap(self: Some[Callable[[C], E]], other: Option[C]) -> Option[E]:
    #     return other.fmap(self.value)

    def flatmap(self: Reader[R, A],
                f: Callable[[A], Reader[R, B]]) -> Reader[R, B]:
        def new_action(r: R) -> B:
            a = self.action(r)
            rb = f(a)
            return rb.action(r)
        return Reader(new_action)

    @staticmethod
    def run_reader(reader: Reader[R, A], env: R) -> A:
        return reader.action(env)