    import java.lang { System { lineSeparator } }

    "Represents the operating system on which the current
     process is running."
    see (`value process`, `value runtime`, `value language`,
        `value system`)
    tagged("Environment")
    shared native object operatingSystem {

        "Returns the name of the operating system this process is
         running on: `linux`, `mac`, `unix`, `windows` or `other`."
        shared native String name {
            String? os = process.propertyValue("os.name")?.lowercased;
            if (exists os) {
                if (os.contains("win")) {
                    return "windows";
                } else if (os.contains("mac")) {
                    return "mac";
                } else if (os.contains("linux")) {
                    return "linux";
                } else if (os.contains("nix")
                        || os.contains("freebsd")
                        || os.contains("openbsd")
                        || os.contains("netbsd")
                        || os.contains("sunos")) {
                    return "unix";
                }
            }
            return "other";
        }

        "Returns the version of the operating system this
         process is running on or `Unknown` if it was not
         possible to retrieve that information. The result
         is completely dependent on the underlying system."
        shared native String version => "Unknown";

        "The line ending character sequence on this platform."
        shared native String newline;

        "The character used on this platform to separate the
         folder/file elements of a path."
        shared native String fileSeparator {
            assert (exists result = process.propertyValue("file.separator"));
            return result;
        }

        "The character used on this platform to use as a
         separator between several paths in a list of paths."
        shared native String pathSeparator {
            assert (exists result = process.propertyValue("path.separator"));
            return result;
        }

        string => "operating system [``name`` / ``version``]";
    }

    shared native("jvm") object operatingSystem {

        shared native("jvm") String version =>
                process.propertyValue("os.version") else "Unknown";

        shared native("jvm") String newline =>
                lineSeparator();

    }

    shared native("js") object operatingSystem {

        shared native("js") String newline {
            assert (exists result = process.propertyValue("line.separator"));
            return result;
        }

    }