from typing import Union

import humanfriendly


class Memory(int):
    def __new__(cls, value: Union[str, int]) -> "Memory":
        if isinstance(value, str):
            parsed = humanfriendly.parse_size(value, binary=True)
            return super().__new__(cls, parsed)
        return super().__new__(cls, value)


class Time(int):
    def __new__(cls, value: Union[str, int]) -> "Time":
        if isinstance(value, str):
            parsed = humanfriendly.parse_timespan(value) * 1_000_000_000  # ns
            return super().__new__(cls, round(parsed))
        return super().__new__(cls, value)