///|
pub struct File[Component] {
  base : Component
  extension : String
} derive(ToJson, Hash, Eq)

///|
struct Directory[Component](FixedArray[Component]) derive(ToJson, Hash, Eq)

///|
pub struct WinPath {
  disk : Char
  directory : WinDirectory
  file : WinFile?
} derive(ToJson, Hash, Eq)

///|
pub struct UnixPath {
  directory : UnixDirectory
  file : UnixFile?
} derive(ToJson, Hash, Eq)

///|
pub(all) enum Path {
  WPath(WinPath)
  UPath(UnixPath)
} derive(ToJson, Hash, Eq)

///|
struct WindowsPathComponent(String) derive(ToJson, Hash, Eq)

///|
struct UnixPathComponent(String) derive(ToJson, Hash, Eq)

///|
pub typealias Directory[WindowsPathComponent] as WinDirectory

///|
pub typealias Directory[UnixPathComponent] as UnixDirectory

///|
pub typealias File[WindowsPathComponent] as WinFile

///|
pub typealias File[UnixPathComponent] as UnixFile

///|
trait PlatformPath {
  from(s : String) -> Self raise
  is_system_call_valid(s : String) -> Bool
}