1- import { GeneratorFlow } from './generator-flow' ;
1+ import { GeneratorFlow } from '../generator-flow' ;
2+ import { DataFormat } from './domain' ;
23
34type Quote = '"' | "'" ;
45
@@ -47,6 +48,10 @@ function readCSVLine(chars: string[], startAt: number, delimiter: string = ','):
4748 return [ i + 1 , values ] ;
4849}
4950
51+ function writeCSVLine ( line : Array < string > , delimiter : string = ',' ) : string {
52+ return line . map ( ( it ) => `"${ it . replace ( / " / g, '\\"' ) } "` ) . join ( delimiter ) ;
53+ }
54+
5055export function * parseCSV ( content : string , delimiter : string = ',' ) : Generator < Array < string > , void > {
5156 const chars = content . split ( '' ) ;
5257 let charPointer = 0 ;
@@ -68,3 +73,22 @@ export function parseCSVToFlow(content: string, delimiter: string = ','): Genera
6873export function parseCSVSync ( content : string , delimiter : string = ',' ) : Array < string [ ] > {
6974 return parseCSVToFlow ( content , delimiter ) . toArray ( ) ;
7075}
76+
77+ export function * writeAsCSV ( content : Array < string [ ] > , delimiter : string = ',' ) : Generator < string , void > {
78+ for ( const line of content ) {
79+ yield writeCSVLine ( line , delimiter ) ;
80+ }
81+ }
82+
83+ export function writeAsCSVSync ( content : Array < string [ ] > , delimiter : string = ',' ) : string {
84+ return new GeneratorFlow < string > ( ( ) => writeAsCSV ( content , delimiter ) ) . toArray ( ) . join ( '\n' ) ;
85+ }
86+
87+ export const CsvFormat : DataFormat < unknown > = {
88+ serialize ( object : Array < string [ ] > , delimiter : string = ',' ) : string {
89+ return writeAsCSVSync ( object , delimiter ) ;
90+ } ,
91+ deserialize ( content : string , delimiter : string = ',' ) : Array < string [ ] > {
92+ return parseCSVSync ( content , delimiter ) ;
93+ }
94+ } ;
0 commit comments