// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Snapshot from http://www.nasdaq.com/screening/company-list.aspx // Fetched 2/23/2014. // "Symbol","Name","LastSale","MarketCap","IPOyear","Sector","industry","Summary Quote", // Data in stock_data.json import 'dart:convert'; import 'dart:math' as math; import 'package:sky/mojo/asset_bundle.dart'; import 'package:sky/mojo/net/fetch.dart'; final math.Random _rng = new math.Random(); class Stock { String symbol; String name; double lastSale; String marketCap; double percentChange; Stock(this.symbol, this.name, this.lastSale, this.marketCap, this.percentChange); Stock.fromFields(List<String> fields) { // FIXME: This class should only have static data, not lastSale, etc. // "Symbol","Name","LastSale","MarketCap","IPOyear","Sector","industry","Summary Quote", lastSale = 0.0; try{ lastSale = double.parse(fields[2]); } catch(_) {} symbol = fields[0]; name = fields[1]; marketCap = fields[4]; percentChange = (_rng.nextDouble() * 20) - 10; } } class StockData { List<List<String>> _data; StockData(this._data); void appendTo(List<Stock> stocks) { for (List<String> fields in _data) stocks.add(new Stock.fromFields(fields)); } } typedef void StockDataCallback(StockData data); const _kChunkCount = 30; String _urlToFetch(int chunk) { if (rootBundle == null) return '../data/stock_data_${chunk}.json'; return 'https://domokit.github.io/examples/stocks/data/stock_data_${chunk}.json'; } class StockDataFetcher { int _nextChunk = 0; final StockDataCallback callback; static bool actuallyFetchData = true; StockDataFetcher(this.callback) { _fetchNextChunk(); } void _fetchNextChunk() { if (!actuallyFetchData) return; fetchBody(_urlToFetch(_nextChunk++)).then((Response response) { String json = response.bodyAsString(); if (json == null) { print("Failed to load stock data chunk ${_nextChunk - 1}"); return; } JsonDecoder decoder = new JsonDecoder(); callback(new StockData(decoder.convert(json))); if (_nextChunk < _kChunkCount) _fetchNextChunk(); }); } }