12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- from std/sugar import dup
- from std/sequtils import map, map_it, all_it, any_it
- from std/os import split_path, join_path, is_root_dir
- from ./utils import all_eq, to_bool
- iterator transpose[T](s: seq[seq[T]]): seq[T] {.noSideEffect.} =
- block running:
- for i in 0..int.high:
- var res = new_seq[T] s.len
- for (idx, it) in s.pairs:
- if i > it.high:
- break running
- res[idx] = it[i]
- yield res
- template ipairs(n, i, it, body) =
- var n = 0
- for i in it:
- body
- n.inc
- func parts(path: string): seq[string] = # TODO: maybe do this with iterator?
- var p, file: string
- p = path
- while not false:
- (p, file) = p.split_path
- if [p, file].all_it(it.len == 0):
- return
- elif p.is_root_dir and not file:
- return result.dup(insert(p, 0))
- result.insert(file, 0)
- func strip_paths*[T = seq[string]](paths: T): (string, T) =
- let pp = paths.map parts
- ipairs(n, i, pp.transpose) do:
- if not i.all_eq:
- if i.any_it it.len == 0:
- n.dec
- return (pp[0][0..<n].join_path, pp.map_it it[n..it.high].join_path)
|