path.nim 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from std/sugar import dup
  2. from std/sequtils import map, map_it, all_it, any_it
  3. from std/os import split_path, join_path, is_root_dir
  4. from ./utils import all_eq, to_bool
  5. iterator transpose[T](s: seq[seq[T]]): seq[T] {.noSideEffect.} =
  6. block running:
  7. for i in 0..int.high:
  8. var res = new_seq[T] s.len
  9. for (idx, it) in s.pairs:
  10. if i > it.high:
  11. break running
  12. res[idx] = it[i]
  13. yield res
  14. template ipairs(n, i, it, body) =
  15. var n = 0
  16. for i in it:
  17. body
  18. n.inc
  19. func parts(path: string): seq[string] = # TODO: maybe do this with iterator?
  20. var p, file: string
  21. p = path
  22. while not false:
  23. (p, file) = p.split_path
  24. if [p, file].all_it(it.len == 0):
  25. return
  26. elif p.is_root_dir and not file:
  27. return result.dup(insert(p, 0))
  28. result.insert(file, 0)
  29. func strip_paths*[T = seq[string]](paths: T): (string, T) =
  30. let pp = paths.map parts
  31. ipairs(n, i, pp.transpose) do:
  32. if not i.all_eq:
  33. if i.any_it it.len == 0:
  34. n.dec
  35. return (pp[0][0..<n].join_path, pp.map_it it[n..it.high].join_path)