Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Completed my assignment #63

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# Swap
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]

# Session
Session.vim

# Temporary
.netrwhist
*~
# Auto-generated tag files
tags

# SASS
.sass-cache/
*.css.map

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Typescript v1 declaration files
typings/

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
10 changes: 10 additions & 0 deletions data/lorem.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean suscipit nec mi
et semper. In sed mi vel elit ornare ultricies sit amet id lectus. Cras tortor
nisl, tincidunt vel faucibus eu, fringilla interdum libero. Morbi tempus massa
et ligula gravida, vitae tincidunt ipsum ullamcorper. Praesent iaculis enim
auctor libero vestibulum semper. Cras blandit euismod ipsum at vestibulum.
Aenean dapibus lacus lacus, et mollis ipsum varius ut. Praesent fermentum mi non
mauris dictum mollis. Pellentesque varius mi sit amet blandit euismod. Mauris
suscipit felis at tristique semper. Vivamus et gravida nulla. Mauris nec blandit
ligula. Morbi tristique augue ac nisl suscipit, quis tristique lectus convallis.
Donec sed ligula sit amet mauris consequat pulvinar.
1 change: 1 addition & 0 deletions data/test.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello!Hello Again!
58 changes: 58 additions & 0 deletions emitter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
function Emitter() {

// Object to store events
this._events = {};

// Attach event listener
this.on = ( eventName, listener ) => {
// If this eventType array exists
if( this._events[eventName] ) {
// Push the callback into array
this._events[eventName].push( listener );
} else {
// Initialize empty array
this._events[eventName] = [];
// Push the callback into array
this._events[eventName].push( listener );
}
};

// Emit events
this.emit = ( eventName, args) => {
let hasListeners = false;

// Iterate through events
for( const prop in this._events ){
// Compare eventName to property
if( prop === eventName ) {
// Listener found
hasListeners = true;
// Trigger callbacks
this._events[eventName].forEach( listener => listener(args));
};
};

// Return result
return hasListeners;
};

// Remove listeners
this.removeListener = (eventName, listener) => {
// Iterate through array of listeners
// and filter out listener
let filtered = this._events[eventName].filter( cb => cb !== listener );
// Assign filtered values as new array
this._events[eventName] = filtered;

};

// Remove all listeners
this.removeAllListeners = eventName => {
// Delete property
delete this._events[eventName];
};


};

module.exports = Emitter;
71 changes: 71 additions & 0 deletions fsp.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
const fs = require('fs');

// fsp module wraps fs methods and returns promises
const fsp = {

readFile( path ) {
// Return a promise
return new Promise( (resolve, reject) => {
// Read in the file specified in path in utf8 format
fs.readFile( path, 'utf8', (err, data) => {
if( err ) {
// Reject if error
reject( err );
}
// Else resolve with data
resolve( data );

});
});
},

writeFile( path, message ) {
// Return a promise
return new Promise( (resolve, reject) => {
// Write message to path
fs.writeFile( path, message, 'utf8', err => {
if( err ) {
// Reject if error
reject( err );
} else {
resolve( message );
}
});
});
},

appendFile( path, message ) {

return new Promise( (resolve, reject) => {
// Append message to path
fs.appendFile( path, message, 'utf8', err => {
if( err ) {
// Reject on error
reject( err );
} else {
// Else resolve message
resolve( message );
}
});
});
}

};

fsp.readFile('./data/lorem.txt')
// Output the file data
.then( data => console.log( data ) )
// Catch any errors
.catch( err => console.error( err ) );

fsp.writeFile('./data/test.txt', 'Hello!')
// Output the written data
.then( res => console.log( res ) )
// Catch any errors
.catch( err => console.error( err ) );

fsp.appendFile('./data/test.txt', 'Hello Again!')
.then( res => console.log( res ) )
.catch( err => console.error( err ) );


25 changes: 25 additions & 0 deletions testEvents.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const Emitter = require('./emitter');
//const Emitter = require('events');

const emitter = new Emitter();

// Event listeners
const betListener = () => console.log('Bet!');
const betListener2 = () => console.log('Bet!Bet!');
const msgListener = (msg) => console.log(msg);

emitter.on( 'bet', betListener );

emitter.on( 'bet', betListener2 );

emitter.on( 'msg', msgListener);

emitter.emit('bet');

emitter.emit('msg', 'Whats Up!');

//emitter.removeAllListeners('bet');
//emitter.emit('bet');
emitter.removeListener('msg', msgListener);

emitter.emit('msg', 'Im a message!');
120 changes: 120 additions & 0 deletions warmup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
// Warmup #1:
//
// Promise resolves the message 'Hello Promise!' after one second
const p = new Promise( (resolve, reject) => {
setTimeout( () => resolve( 'Hello Promise!' ), 1000);
});

// Uses then to resolve the promise and console.log the message
p.then( message => console.log( message ) )
.catch( error => console.error( error ) );

// Warmup #2:

const delay = milliseconds => {
// Returns a promise that resolves the value `milliseconds`
// after delaying for the specified number of milliseconds
return new Promise( resolve => {
setTimeout( () => resolve( milliseconds ), milliseconds );
});
};

// Countdown function uses the delay function to chain and output a countdown
const countDown = count => {

if( count <= 0) {
console.log('Done');
return count - 100;
}

console.log( count );

return count - 100;
};

delay( 1000 )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown )
.then( countDown );


// Warmup #3:
//
// `square` accepts a number and resolves that number squared
const square = number => {
return new Promise( ( resolve, reject ) => {
// Reject if not passed a number
if (typeof(number) !== 'number'){
reject( 'Not a number!');
}
resolve( number * number );
});
};

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];

// Map array of numbers to an array of promises using `square`
numbers = numbers.map( num => square(num) );

// Get the result of all promises in the array
Promise.all( numbers )
.then( results => console.log( results ))
.catch( err => console.error( err ));


// Warmup #4:
//

const doBadThing = forRealz => {
// Return a promise that resolves to 'Yay!' when `forRealz` is falsy
return new Promise( ( resolve, reject ) => {
if( forRealz ) {
reject('Ew');
} else {
resolve( 'Yay!');
}
});
};

doBadThing( true )
.then( result => console.log( result ))
.catch( error => console.error( error ));

doBadThing( null )
.then( result => {
console.log( result );
throw "ERROR!";
})
.catch( error => console.error( error ));

doBadThing( null )
.then( result => {
console.log( result );
throw "ERROR!";
// Note that the `reject` handler doesn't catch the throw error
// while `.catch` does
},
err => console.error( err ));