lib-utils-ts
Version:
<img src="https://img.shields.io/npm/v/lib-utils-ts"/> <img src="https://img.shields.io/snyk/vulnerabilities/npm/lib-utils-ts"/> <img src="https://img.shields.io/npm/l/lib-utils-ts"/> <img src="https://img.shields.io/github/languages/top/devGnode/lib-util
121 lines (112 loc) • 4 kB
text/typescript
import {consumer, IConsumer, iterator, List, predicate, predicateFn, predication} from "../Interface";
import {File} from "./File";
import {Objects} from "../type/Objects";
import {Consumer} from "../Consumer";
import {ArrayList} from "../utils/ArrayList";
import {Predication} from "../utils/Predication";
/***
* @writer maroder
* @version 1.0-R-JSTrip
*/
export class TreeDir{
private readonly file:File = null;
private predicate:predicate<File> = null;
private readonly deep:number = 1;
private iterate:number;
protected static readonly PassPredicate = class PassPredicate implements predicate<File>{
test: predicateFn<File> = (file:File)=>true;
};
public constructor(file:File, deep:number = 1 ) {
this.file = file;
this.deep = deep==null?1:deep;
this.iterate = 0;
}
/***
* @return {File}
*/
public getFile():File{return this.file;}
/***
* @return {number}
*/
public getDeep():number{ return this.deep;}
/***
* @return {number}
*/
public getIterate():number{ return this.iterate;}
/***
* @return {predicate<File>}
*/
public getPredicate():predicate<File>{return !Objects.isNull(this.predicate) ? this.predicate : new TreeDir.PassPredicate();}
/***
* @param {predication<File>} predicate
* @return {TreeDir}
*/
public setPredicate(predicate:predication<File>):TreeDir{
this.predicate = Predication.of(predicate);
return this;
}
/***
* @param {consumer<File>} consumer
*/
public read(consumer:consumer<File>){return this.read0(this,Consumer.of(consumer));}
/***
* @return {List<File>}
*/
public getList():List<File>{
let out:List<File> = new ArrayList();
this.read((o:File)=>out.add(o));
return out;
}
/***
*
* @param {TreeDir} self
* @param {IConsumer<File>} consumer
*/
protected read0(self:TreeDir, consumer:IConsumer<File>){
let files:iterator<File>, file:File, slf:this=this;
files = Array.asList(Objects.requireNotNull(self.getFile().listFiles()))
.listIterator();
while(files.hasNext()){
file = files.next();
if(file.isFile()&&this.getPredicate().test(file)) consumer.accept(file);
if(file.isDirectory()&& this.getIterate() < this.getDeep() ){
this.iterate++;
this.read0(new class extends TreeDir{
constructor() {super(file, slf.iterate);}
public getIterate(): number {return slf.iterate;}
public getPredicate(): predicate<File> {return slf.predicate;}
}, consumer);
this.iterate=0;
}
}
}
/***
* @param {string} path
* @param {number} depp
* @return {TreeDir}
*/
public static of(path:string, depp?:number):TreeDir{ return new TreeDir(new File(path),depp); }
public static from(pattern:string):List<File>{
let file:File= new File(pattern);
if(file.isFile()) return Array.list(file);
if(file.isDirectory())return TreeDir.of(file.toString(), 0).getList();
else{
let deep:number = 0,
ext:string;
if(file.getParent()&&file.getParentFile().getName().startsWith("*")){
deep=50;
ext=file.getName().replace("*","");
file=file.getParentFile().getParentFile();
}else if(file.getName().startsWith("*")){
deep=0;
ext=file.getName().replace("*","");
file=file.getParentFile();
}
return TreeDir
.of(file.toString(),deep)
.setPredicate((file:File)=>Objects.isNull(ext)?true:file.isFile()&&file.getName().endsWith(ext))
.getList();
}
}
}
Object.package(this);