text:
Ovechkin helps Capitals beat Flyers 6-3
Friday - 9/27/2013, 10:30pm  ET
WASHINGTON (AP) -- Alex Ovechkin and Eric Fehr each scored twice to power the Washington Capitals to a 6-3 win over the Philadelphia Flyers on Friday night in a preseason game that included five fights.
Fehr has four goals in the last two games and a team-high five in the preseason for the Capitals (4-0-3), who blew a three-goal lead but remained undefeated.
The Flyers trailed 3-0 before Claude Giroux, Scott Hartnell and Wayne Simmonds scored in the final 5:55 of the second period.
Fehr powered his own rebound past Ray Emery to make it 4-3 just 1:35 into the third. Ovechkin followed with his second goal.
Michal Neuvirth made 32 saves for the Capitals.
Tom Wilson and Mathieu Perreault also scored for Washington.
Copyright 2013 The Associated Press. All rights reserved. This material may not be published, broadcast, rewritten or redistributed.


text:
promotional discount applied. Cart total will reflect savings.
Quantity discount will reflect in cart.
This product may only be purchased with the approval of a veterinarian and may require verification. We will collect any necessary information at checkout and verify a prescription if required.
Sometimes, manufacturers require that products be advertised only at their suggested prices. When we choose to sell these items for less, we display the sale price only in the cart. To see the price, click Add to Cart.
One-time delivery
Save 10% with Auto Ship (Details) Deliver Every: 2 Weeks 3 Weeks 4 Weeks 5 Weeks 6 Weeks 7 Weeks 8 Weeks 1 Month 2 Months 3 Months 6 Months
Zoo Med Sinking Resin Aqualog
Starting from: $10.99
Carib Sea Super Naturals Zen Garden Gravel
Now: $34.99
ColorBurst Florals Blue Broad Leaf Plant
Starting at: $5.49
ColorBurst Florals Large Bush Plant
ColorBurst Florals Amazon Plant
Starting at: $3.39
Product Summary:
Blue Ribbon ColorBurst Florals Medium South American Flowering Cluster Value Pack
Convenient assortment of realistic looking silk plants adds instant interest to you aquaiurm. Weighted base prevents plants from floating and makes installation easy.
ColorBurst Florals African Cluster Value Pack
Now: $12.49
Blue Ribbon Rock Arch with Silk Plants
Now: $8.99
ColorBurst Florals Amazon Cluster Value Pack
Now: $16.99
ColorBurst Florals African Sword Plants
Starting from: $9.99
ColorBurst Florals Sword Leaf Plant
Starting at: $9.49
Seachem Freshwater Neutral Regulator
Pondcare Activated Filter Carbon
Now: $6.49
Conceptual Creations Bedford Aquatic Rock
Now: $23.99
Amazon Butterfly Leaf Plants With Buds
Starting from: $12.99
Instant Ocean Fancy Plant Mat
Starting from: $14.99
Onyx PH Stabilizing Freshwater Gravel
CaribSea Aragonite Fiji Pink Reef Sand
Starting from: $51.99
Seagarden Anemone Elephant Ear
Starting at: $8.36
Product Reviews by Customers
This item is not eligible for Canadian shipping.
Some items everyday price is so low we can't discount or we have marked down the item to a final sale price. These select items will not be included in your order total when determining if your order qualifies for a promotional event.

subset: commoncrawl


text:
Source Naturals Wellness Zinc Lozenges™ Peach-Raspberry -- 23 mg - 120 Lozenges
Summer flavors anytime of the year
We'd been getting a similiar zinc lozenges at our local health food store, but it was an out of the way drive from our home On a whim, I thought I'd take a chance on these, as they seemed equivilant to the product we'd purchased before. I'm glad I did. They taste great and are practically a carbon copy of what we'd used before. The flavor is refreshing. Now we don't have to work in a trip to that particular store when I can add it to my list here!
July 18, 2013
Tastes Wonderful!
This is the best tasting Zinc supplement I've found. Zinc doesn't usually taste very good, but this one is strong/effective AND tastes great. I've been buying it for years.
December 14, 2012
Beneficial for Skin Issues
Rough dry skin cleared-2 days!
October 17, 2008
These are wafer-like zinc lozenges that have a raspberry/peach flavor. You certainly get a lot of value for the money...you get a fairly large bottle of lozenges. They taste tart and chalky, just as you would expect a tablet form zinc lozenge to taste. However, they made me nauseous almost everytime I took them...even when I took them on a full stomach. I've had zinc lozenges in the past that did not make me nauseous, so I know there are some out there that might suit me better.
September 4, 2008
Flavor not so good
I will eat these if I think I am really in need of zinc but the taste is a bit yucky. The chewable starts out with a nice peachy, fruity flavor but as the wafer crumbles you get the bad zinc flavor. I was hoping to give these to my son but there is no way he would take these cooperatively.
August 6, 2008


text:
Quick Links
Memorial Physicians have a wide breadth and depth of medical and clinical expertise. They also have interesting personalities, philosophies, hobbies and community involvement. Please take a moment to meet some of our physicians and learn more about what makes them similar and unique in how they chose a career in medicine, approach working with patients and why they enjoy living in Yakima.
Ryan Black, DO Yakima Ear, Nose & Throat |
Brett DeGooyer, DO Lakeview Spine |
Henry Kim, MD Water's Edge |
Ross Bethel, MD Selah Family Medicine |
Ankur Rana, MD Pacific Crest Family Medicine |
Tanny Davenport, MD Family Medicine of Yakima |
Lorena DeMarco Garcia, MD Yakima Vascular Associates |
Daniel Doornink, MD Cornerstone Medicine |
Sylvia Labes, MD Cornerstone Medicine |
Ryan Moultray, DO Selah Family Medicine |
Carl Olden, MD Pacific Crest Family Medicine |
Jeffrey Ventre, MD Lakeview Spine |
Vicky Jones, MD North Star Lodge |
Martin Bäcker, MD Cornerstone Medicine |
Sean Mullin, DO Lakeview Spine |
Robert Williams, MD Yakima Gastroenterology Associates |
Amanda Ryder, MD Family Medicine of Yakima |
Kristin Larson, MD Apple Valley Family Medicine |
David Pommer, MD Selah Family Medicine |
Bob Krauth, MD Family Medicine of Yakima |
Daniel Kwon, MD Water's Edge |
David Doornink, MD Cornerstone Medicine |
Uzma Ramzan, MD Memorial Sleep Center |


text:
'Muamba's miraculous recovery is proof that God listens to our prayers' (From Stroud News and Journal)
Get involved: send your pictures, video, news and views by texting SNJ NEWS to 80360, or email us
Report this comment
'Muamba's miraculous recovery is proof that God listens to our prayers'
8:30am Sunday 6th May 2012 in News
Christian Comment with Andy Harding of Psalms Strategic Youth and Sports Minster ON March 17, 2012 people from all ages, backgrounds and communities joined the Pray for Muamba campaign. His wife said every prayer makes him stronger, to God be the glory. It was considered a complete miracle that Fabrice Muamba began to rapidly recover, given that he was effectively dead for 78 minutes. What was described across the media was initially miraculous then became remarkable and then became virtually forgotten. That is until he walked out before last weekÕs Bolton match.
Muamba was clearly emotional, shedding tears. What was unthinkable and beyond people's wildest expectation had become the reality. Muamba could walk, talk and even contemplate a return to the Premier Football League. We turned to God in despair, he answered... but we forgot and moved on. In desperation we deem it acceptable to turn to God Ð and it is.
But God wants to be involved in every aspect of our lives. He wants to walk and talk with us, throughout our daily struggles and joys; our achievements and failings. It isnÕt that he ignores our 999 prayers in our darkest moments. It is more that the same God who created us, came to earth to ride the rollercoaster of life alongside us. God wants us to pray to him. God wants individuals, communities and nations to unite in prayer. Praying for our wellbeing, our families, our community, our nation, and all other areas of life that are important to us: and therefore important to God. Let us unite in prayer as so many of the football world did on the weekend of March 17. God listens and responds.


text:
Nov 7, 2013
Nov 6, 2013
Jan 29, 2013
As President Obama�s second term kicks off, three key positions have turned over. Senator Kerry has been nominated to replace Secretary of State Hillary Clinton as the nation's top diplomat. Former Senator Chuck Hagel has been nominated to replace Secretary of Defense Leon Panetta as the head of the Pentagon. The President�s close adviser on counterterrorism, John Brennan, is slated to become the next Director of the CIA.
Jan 10, 2013
At the 11th hour, Vice President Biden and Senate Minority Leader Mitch McConnell brokered a deal that averted the so-called "fiscal cliff," forestalling massive government cuts that could have plunged the country back into a recession. At the CNP Edmund S. Muskie Awards Banquet, Secretary of Defense Leon Panetta described the sequestration budget cuts associated with the fiscal cliff as a gun held to the head of Congress. But the fiscal cliff deal only delayed sequestration and a decision on the federal debt ceiling. Our two expert speakers - no strangers to the federal budget and fiscal policy - provide some much-needed insight on what the deal really meant and how the White House and Congress can chart the dangerous waters ahead.
Nov 29, 2012
Cybercrime is one of the fastest growing areas of crime, estimated to cost the world over $110 billion annually. The global nature of today's interconnected networks and systems means that criminals can act from anywhere in the world against any target. As more and more of our lives are online through smartphones, the cloud, and other innovative technologies, we are seeing an emerging trend of criminal syndicates and other organized groups increasingly becoming involved in cybercrime and cyber attacks.
Nov 14, 2012
The Sovereign Citizen Movement, a domestic terrorist group, has been listed by the FBI and the Southern Poverty Law Center as a growing anti-government extremist group who believe themselves to be separate from the United States. Their disregard for the law has often led to dangerous situations and sometimes even deadly confrontations with the police.
Oct 9, 2012
Targeted killings, most of them via drones, have become the centerpiece of the Obama Administration's counter-terrorism strategy. In Pakistan, Libya, Somalia, Yemen, and elsewhere, drones have stood ready in the skies to strike at America's enemies. But is this strategy working? Is it productive?
Sep 20, 2012
The Center for National Policy hosted Walter Pincus for a discussion on the prospect of defense sequestration and concurrent implications for Congress and the Department of Defense.
Sep 13, 2012
The Center for National Policy hosted New York Times chief Washington correspondent David Sanger for a discussion about his new book on President Obama's foreign policy "Confront and Conceal."


text:
The Travel Department is part of Purchasing Department located in the Auxiliary Services Building. We are one of the departments that support your travel needs.
The Travel Office is dedicated to providing you with the very best travel support. We offer the following services:
Air tickets will be centrally billed to BYU-Idaho's business travel account.
Our first priority is researching the least expensive airline fares. We would like to work together with you to find that 'best' fare. Non-refundable or penalty tickets will be selected when available and practical. We also use negotiated airline contracts when applicable.
Our service hours are from 8:00 am to 5:00 pm Monday through Friday. We can be contacted at:
Travel Office | 208-496-2340 | |
Jeorgette Requiron | 208-496-2341 | |
Trisha Cole | 208-496-2342 | |
Fax | 208-496-6960 | |
Emergency Cell | 208-313-5660 |
Electronic Travel Authorization numbers must be received in the Travel Office to complete the purchase of airline tickets. Credit card numbers are required to confirm hotel rooms. The Travel Authorization form is electronic, and the link can be found HERE. If you are inviting someone to campus, we require a Guest Travel document, available at the SAME WEB PAGE.
If you have any questions or need assistance while you are traveling or after business hours, please call our emergency telephone number listed above. We can help with canceled flights, emergency return trips and most any needs you might have while traveling.
BYU-Idaho has an agreement with International SOS. For more information about the procedure for medical emergencies, please see our website. Please review this information before you travel, especially when traveling internationally.
We can help with simple airfare, car rental and hotels the traveler has researched. Our response time depends on our work load at the time you are planning the trip. Trip planning and frequent flyer reward bookings are outside of the scope of our services.
Please complete a Travel Profile before your first travel request. Profile data will ensure that the reservation request is processed appropriately. Frequent flyer numbers will be recorded and automatically added to reservations. Be aware that the frequent flyer card must match the name on the airline reservation. The Travel Office always recommends individuals check-in with their card on the day of travel to insure the miles are recorded. We will need your email address to send confirmation of ticketing. Airlines now also request a home phone number to alert you personally if there is a schedule change inside 48 hours of your flight.
The Transportation Security Administration (TSA) is now enforcing their Secure Flight passenger program. When making airline reservations travelers (passengers) will now be required to provide their full name as it appears on government issued identification being used when traveling. Secure Flight does not require the names on all your ID's be identical. You should provide your name as it appears on your government-issued ID that you plan to use when traveling. We need to make sure the information is correct to avoid problems. TSA will start denying boarding and there could be penalties for missed flights. Please be prepared to provide this information to the Travel Office representatives when making reservations. Make sure if you are using I Travel to fill out your profile and that you list the correct name matching your ID as well as your date of birth and gender. For more information on Secure Flight please visit www.tsa.gov/secureflight.
An E-ticket will be issued for domestic and international travel. Most airlines now charge extra for a paper ticket. You will receive notification of ticketing via Virtually There. Virtually There is a web site with real-time itineraries, destination information, record of your invoice, and last minute flight schedule information. You are connected specifically to your reservation. In each airline ticket record we will record an email that will enable you to retrieve the ticketing information. Each email address registered to this ticket will receive a link to a web site that contains all of the flight information. This information will record any flight time or flight number change and update the record automatically. The Travel Office recommends the traveler print the itinerary and ticket information just before they travel, so the information is up to date.
The Travel Office will also have a live record of the traveler's information and resend the email to remind the traveler to review the flight information if there has been a major flight change.
Should a flight change be required, most airlines charge a fee to change a penalty-fare ticket. In addition to the fee there is a chance of paying a difference in the fare if your new ticket costs more than the original ticket. The traveler is responsible to get approval for the additional charge. If the traveler needs to change the return portion of the ticket after departure, they may call the airline directly or call the Travel Office for assistance. Usually the Travel Office can offer more options than the airline.
If the ticket must be canceled completely, please call the travel office. We can keep a log of canceled tickets. The destination, routing, and dates of travel may be changed, but the name cannot be changed. When the ticket is used again, there will usually be a penalty, plus additional fare.
Brigham Young University - Idaho's authorized rental car agencies are National/Alamo and Hertz. Rental car reservations should be made by the Travel Office to ensure that contract rates, unlimited miles and insurance are appropriately applied. The standard rental car class is midsize. The rates may be advertised lower than what is quoted by the Travel Office, but those rates may not include everything Church Travel has negotiated for car rental. Insurance is included in our car rental contracts. Car rental upgrades and gasoline options can add to cost of car rental. Decline all optional insurance and fuel service options. It is less expensive if you fill the gas tank prior to returning the rental car. Please read and follow directions to avoid an extra charge. Once the traveler initials a contract, it is very difficult to revise. It is important to report a rental car accident to the Travel Office.
The Travel Office maintains a list of hotels used by the University. Our preferred properties are listed on our website. Please call or email your request with dates, number of people, preferred property, and credit card number to hold the reservation. The only direct bill hotels at this time are:
AmericInn Rexburg, ID
Comfort Inn Rexburg, ID
Springhill Suites Rexburg, ID
BYU-Idaho has a preferred rate with Marriott, LaQuinta, and Best Western Hotels. Generally, we can find best rates available on hotels. Let us know if you would like to compare prices to get the best rate.
If you need to cancel a hotel room that has been arranged by the Travel Office, please call us to cancel. Cancellation rules are included on "Virtually There" itineraries.
The Travel Office maintains the Per Diem and Mileage Charts. There is a link to the information from the Travel Office website.
JP Morgan Chase is BYU-Idaho's authorized charge card company. The traveler is strongly encouraged to use this card for all travel-related business expenses. Each traveler is responsible for the payment of monthly statements. Fees for late payment are also the traveler's responsibility. Report any lost or stolen cards to JP Morgan and the Accounting Office.
Passports: The Travel Office would like to keep record of your passport if you have one. Responsibility for renewal and initial application is the traveler's. Most countries require your passport be valid for six months after scheduled departure from the international country. New passport requirements for travel to Canada and Mexico are in effect 31 Dec 2006. Please see our web page for updates.
International Visas: The travel office does utilize a visa service agency for international visas. Contact the Travel Office for details on the countries you plan to visit. To apply for an international visa, you must have a valid passport.


text:
The Board of County Commissioners on Monday agreed to a planning department request to move forward with an administrative approval process for Fram America's exploration well application at a site north of Delta.
The proposed well will be a re-entry of a previous gas exploration well that was drilled in 2006 by another exploration company.
Fram will be using the same roads and well pad that were approved for use in the 2006 operation, and the site was vetted with a full county Specific Development process in 2006, the commissioners were told.
Granting the administrative approval allows the county planning department and representatives from Fram to begin working on a development agreement for the BoCC's consideration. That agreement will spell out in detail various aspects of the operation, including possible expansion with more wells in the area if Fram finds oil in the formations it is exploring.
According to a previous presentation made to the BoCC on the project, if successful, the company is considering multiple wells from single pad sites using directional drilling techniques.
The exploration seeks to tap private minerals beneath privately owned surface.
blog comments powered by Disqus


text:
Horizontal fabric shades a versatile option for kitchen and bathroom renovationsJan 18 2011 Horizontal fabric shades a versatile option for kitchen and bathroom renovations Chinn shared some design tips for those looking to refresh a kitchen or bathroom. In the kitchen, she suggests that homeowners should keep in mind that the space is now a place for friends and family to gather in addition to a food preparation area. One should consider style, layout, curves, colors and textures before deciding on a new kitchen design. In bathrooms, the most important aspect is practical features. Water-saving appliances and fixtures can be an effective way to save money and go green. Additionally, smart storage solutions can be stylish and helpful to homeowners looking for a better way to keep their toiletries organized. When it comes to window treatments, homeowners may want to consider hanging horizontal fabric shades in a bathroom or kitchen. These versatile shades are a blend of many different styles, making them ideal for a room that boasts a multitude of elements. Related Products
Related Articles | (888) 633-7840 M-F 6am to 5pm Sat 6am to 3pm PST | |||||||
Copyright © 2013 Blinds Chalet. All Rights Reserved. |


text:
Quick Links
2013-14 Denison Schools Employment Opportunities
View complete list of jobs available
Star Testing Login - Click Here
2013-14 School Calendar
180 day calendar that includes inservice, vacation, early outs and semester events
Event Calendars
Technology and 1:1 Initiative Information
Meal Charge Plan - Changes in effect 2/1/2013
Meal Plan Change Information - English
Meal Plan Change Information - Spanish
PowerSchool Parent Portal Link
Click here to go to PowerSchool Parent Portal
It is the policy of the Denison Community School District not to discriminate on the basis of race, creed, color, sex, sexual orientation, gender identity, disability, religion, age, political affiliation, socioeconomic status, or marital status in its programs, activities, or employment practices as required by the Iowa Code sections 216.9 and 256.10(2), Titles VI and VII of the Civil Rights Act of 1964 (42 U.S.C. § 2000d and 2000e), the Equal Pay Act of 1973 (29 U.S.C. § 206, et seq.), Title IX (Educational Amendments, 20 U.S.C. §§ 1681 – 1688) Section 504 (Rehabilitation Act of 1973, 29 U.S.C. § 794), and the Americans with Disabilities Act (42 U.S.C. § 12101, et seq.). If you have questions or grievances related to compliance with this policy by the Denison Community School District, please contact the Superintendent at Denison CSD, 819 North 16th Street, Denison, Iowa 51442, telephone 712-263-2176, or the Director of the Office for Civil Rights, U.S. Department of Education, 500 W. Madison Street, Suite 1475, Chicago, IL 60661.
Tell us how you would like to receive information updates from Denison Community Schools by choosing to engage with our social media sites or online news updates.
Sign up for our online news updates >>
Already Registered? Login >>
Receive Important School Alerts
All families in our district are linked to Blackboard Connect via PowerSchool. Blackboard Connect allows us to use voice, email and/or textmessaging to communicate school announcements and closing information.
Online Payments with RevTrak
Alumni Association
Nominate an Alum for the Wall of Pride
Booster Clubs
Denison School Foundation
Stay in touch and/or make a Monetary Donation


text:
Search results for Tiny
*Exclusive* Shekinah Jo Talks Extreme Plastic Surgery-Getting A Fake Butt, Her Lipo Showing Back Up In Her Neck, And Being Rich With Tiny [Video]
The home girl, Shekinah Jo from TI & Tiny's Family Hustle, talked to Bossip about extreme plastic surgeries and a whole-lot-more!!!
Do It For The Gram: Tiny's BFF Shekinah Jo Flosses Her Post Plastic Surgery Curves
Shekinah done got knifed up and can't nobody tell her nothin'!
Watch Ya Mouth: T.I. Joins In After Tiny Checks Rude Female Fans – "What He Do With His D**k Is Between Him & God!"
T.I. & Tiny go H.A.M on fans for sideways comments….and Tiny hints that the rumors are true…
T.I. Checks Tiny For Posting Questionable Pics Of Her Butt On IG, But Neither Are Rockin' Wedding Rings!
The social media drama between Mr. and Mrs. Harris continues…
Destiny's Step-Child: Michelle Williams Backpedals After Saying Bey's Freaky New Album "Embarrassed" Her
Looks like Michelle found a seat or two…
Destiny's Chirren: LeToya Luckett Talks Current Relationship With Kelly & Beyonce & Whether Or Not She Was Invited To Their Weddings
Was LeToya invited to witness her former group members enter into wifeyhood?


text:
Keep your elected officials honest. Read about local politicians and their decisions. Flag as Inappropriate
Posts awaiting your approval 0
jMichael March 12, 2014 at 01:57 pm
I say "Stand Your Ground" should apply. If some guy approaches me from behind I am…Read More entirely within my rights to conclude he is threatening me (especially if he's wearing a hoodie). "Stand Your Ground" should apply. Don't mess with me, MoFo. "Stand Your Ground!" [ ] Oh. I almost forgot. Shall Not Be Impinged. WWJD. Well armed militia. Born in Kenya. Reverse Discrimination. Bomb Bomb Bomb Iran. No Free School Lunches. Welfare Queens. Baby Killers. Benghazi. Vince Foster. Fast and Furious. WMD. Mushroom Clouds. Birth Certificate. ObamaCare. The Gays. States Rights. Christian Nation. And if I've missed any: RonaldReaganRonaldReaganRonaldReagan.
There. That should cover it. Bless you. Hallelujah. Et cetera, et cetera, et cetera.
Jose Gonzales February 28, 2014 at 05:08 pm
If it's enacted Georgia will admit to the world that the past few decades have been a horrific lie.
Jerry Frisch March 1, 2014 at 10:18 am
They will likely make the one mistake that keeps the drug dealers in business: taxing the marijuana.…Read More The murders will continue.
Laura Moore March 12, 2014 at 08:10 am
I believe we are rewarding bad behavior and giving into people who have aggression issues. What…Read More about our SENIORS? Or our teenagers just getting their license. They may not be able to get over as quickly as they need to. Further more if the have to turn left they have to take the opportunity when it is available to them. I believe this is only going to cause people to become more impatient when someone is in their way. We should not be rewarding bad behavior instead we should be teaching patience. If they do pass the bill they should only make it the interstate.
jim March 12, 2014 at 02:22 pm
nice law. no police officer could pull anyone over for it.
SO you are saying if you are going the…Read More speed limit and people are trying to pass you over the speed limit , that the police would pull you over instead of the speed drivers ???
I guess you can go as slow as you want really still on the left lane as long as you are passing someone slower on the right lane ?
Taxpayer and voter March 4, 2014 at 10:14 am
Looks like Harry hasn't ever heard of the Mile High Club. And gpurs, what the heck are you even…Read More talking about? Doesn't sound like you are "normal". Times have changed, get over yourself.
Taxpayer and voter March 5, 2014 at 08:30 pm
Harry poor Harry. Heteros have different types of sex, too.
electric123 March 6, 2014 at 01:49 am
@JMichael, You are so blind with your views of perversion and bad behavior, you had better wake up…Read More and smell the coffee before you end up in the bigot nursing home.
Wayne Kelley February 24, 2014 at 08:58 pm
For the last time: I don't give a crap who had more slaves, who started it, under whom it…Read More flourished, and so on and so on. If there are visible symbols of those others, and if they have a similar history to the Confederacy in terms of waging war against the US, and they appear on Georgia official state instruments, please let me know and I will gladly and loudly condemn them as well. God help me, that is my last comment on this thread, because as someone else said, this is a complete waste of time.
Darren Wheeler February 24, 2014 at 11:55 pm
Wayne, censor the U.S. flag, then, because it flew on slave ships (which a Confederate flag never…Read More did) and it represented the government who protected the practice of slavery. And, yes, the reality of the war is even more vivid when you consider that the Confederacy, indeed, was a legitimate nation and, indeed, it was AT WAR with the United States. That is EXACTLY what happened. I'd say I'm stunned that people don't realize that. But knowing how our history is taught (or not taught) I am not at all surprised. The Confederacy had its own constitution, its own president and vice-president, its own postal service with its own stamps, its own currency. Yes, it was a separate nation fighting the United States. BUT!! The only reason it fought against the U.S. is because Lincoln ordered troops to invade the Southern states, otherwise there would have been no war. There could have, instead, been peaceful relations. Slavery would have ended its own death because it was well on its way already. How can one glorify the CSA and call themselves a patriotic American? Because the war and the events surrounding it were 150 years ago. The results of the war were and are just as they are. There is no changing it. The better question is, how can one not grasp that a person can honor their CSA ancestry and heritage and also be a loyal and patriotic American some 150 years later? What is so hard to understand about that?
Ann Hudren February 27, 2014 at 02:25 pm
Still discussing History that you cannot change? A week has passed and the vast majority have…Read More moved onto to more prominent issues. History.
Mitchos Doane March 2, 2014 at 07:20 pm
Tracy you saw the difference between the same breed just coat changes. that's because they use some…Read More other breed to get the longer hair. I don't know if you have ever worked with boxers. the what called Euro Boxer with the American boxer huge difference do some research i think you would be amazed with what you will read. I recently worked with a lab from Europe for service dog work for mobility, let me tell you very easily trained but very snappy at first. where the ones bread here are very different. well this lady has an Amstaff that i had trained as here service dog unfortunately the staff is 12 and cant help much with the lady but done an amazing job teaching Service (labs name) but any ways when you have time go ahead and do some research on the breeds that are of same breed dif. coats or even bread in dif. sides of the world you will be amazed
Tracyfl1 March 2, 2014 at 08:12 pm
I got a Boxer for my 16th birthday (many, many years ago!) she was a beautiful brindle. I didn't…Read More have her ears or tail docked. She was a super sweet dog but unbelievably hyper and not the sharpest tool in the shed. I was always getting in trouble because of her behavior. She would escape from any yard you put her in and she would even get out the screened door or screen windows if she was in the house. The worse thing she liked to do was jump up on the hoods of trucks and cars and scratch them up. She would escape from our house and run to the neighbors and jump up on the roof of their trucks (I'm talking smaller Toyota trucks).
Mitchos Doane March 2, 2014 at 08:22 pm
Yea i belive you she was an american boxer for sure. The euro boxer is much larger and very laid…Read More back . Boxer along with amstaffs pits and jrt are my favorit
Road Scholar February 18, 2014 at 04:08 pm
Mack : When Obama took over responsibility , the economy was still in a tail spin, wasn't it? And…Read More you expect to turn the economy around on a dime? Really? It is like a large ship...it takes time to have a lasting, positive impact...regardless of who was in charge!
Oh and many who have left the job market have retired. Some were ready. Some do not have the computer skills to make it (A friend of mine had this happen). And some would not take jobs because it was demeaning or "below them". I have friends who ate their pride and are doing those jobs to augment their retirement!!!
DM-ATL February 18, 2014 at 09:12 pm
Sorry to burst your rhetoric bubble Mack, but I'm doing just fine. Working a six figure job, son…Read More getting ready to graduate from college with minimal bills, live in a 260k house, travel when I want, and spend a lot of time volunteering in the community. Oh, and by the way, I'm a single African-American mom who is not on food stamps!! Oops, one more thing, we've already benefited from the Affordable Care Act (not o'care as you call it) when my 22 yr old had major procedure after college, and thankfully we were able to put him back on our insurance. Have a great evening.
Alice Pickett February 18, 2014 at 10:38 pm
Sticking to the subject matter, which has gone off into a really weird spin of publishing ones…Read More annual salary, I would like to reassert my opinion that Abraham Lincoln was the greatest of American presidents and Lyndon B. Johnson was the worst. No, Johnson did not create poverty as one contributor suggested I was implying. Of course there have always been many very poor people in the US- in the city and the rural county side. The United States was a beacon for the poor and disadvantaged and absorbed an amazing amount of people that formed our nation along with those that had arrived much earlier and owned land. However, being poor was not synonymous with being a victim and in need of a permanent hand-out. Poor people for the most part worked and lived in a family situation before 1970. Yes there were exceptions as always, but most people were not looking for a check in the mail or an EBT card. In most cities and Atlanta included, Urban Renewal had already replaced the substandard housing that existed. They still had their families, communities and churches. The Great Society was meant to destroy poverty, but the programs offered a way to circumvent the historical pattern of assisting those in need and them permanently connected to government assistance. Of course some people got out of this situation. Many did not and created the underclass that is even harder to break. I see it all the time and saw it tonight. I live near the NW neighborhoods of Atl. that are a sad testament to totally failed programs including Clintons' Empowerment money. No, I do not think Clinton was even close to being the worst president, so no more comments from people who assume way too much.
North Georgia Weather January 28, 2014 at 11:52 am
I have instant updates @ https://www.facebook.com/NorthGeorgiaWeather
Denna Millard January 8, 2014 at 11:22 am
DonnyO - if you are so unhappy about Gwinnett Co - MOVE. It is about time the police and fire…Read More fighters get a raise. We have been loosing a number of these employees to other counties who are paying better/better benefits. We definitely need further emergency provisions in this county. I'm glad you have finally made provisions for all these services.
DonnyO January 8, 2014 at 06:56 pm
Deanna, first of all I have been living here my whole life and don't plan to move anytime soon. It's…Read More just the fact that I see out rights being taken away a little at a time for years and years by power hungry buracrats. Secondly a should have made clear my position on firefighters abd policemen. If your occupation makes you put your life on the line, then I think you should be paid like a rock star. I was mainly referring to county employees whose biggest risk is a paper cut while pushing there pencils around while trying to figure out how to pad there pockets and come up with fascistic rules to to fulfill there power appetite.
GCPS DRIVER January 10, 2014 at 07:28 pm
How about all the county school workers? We deserve raises too! I'm a bus driver/county employee and…Read More drive special needs children. Have been driving for years both special needs and regular ed children but recently here in Georgia. We get paid salary as do most county employees, the downside, our checks are tiny! A pay raise would help along with years put in bump. Would be nice but hey, a raise in any form is a plus! Us bus drivers transport the most precious cargo, our children! We lose drivers all the time because the pay isnt worth the headaches, traffic jams, accidents, getting cut off and having to slam on brakes to miss the person who cut us off in the first place just to race to a RED light! It's a stressful job but someone has to do it. We brave soles are up and running before you even have time to hit the snooze button... we all deserve a raise! Over the past year, starting pay has decreased and job postions lost all in the transportation dept. Most people over look us drivers. We matter too.. without us you would have to drive your own kids to school! I opt for SCHOOL BUS DRIVER PAY INCREASES!!


text:
Habitat for Humanity Celebrates the Legacy of Clarence Jordan
Americus, Ga. - Oct. 29, 1999 - On the 30th anniversary of the passing of Clarence Jordan, a farmer known worldwide for Bible scholarship and racial reconciliation, the people of America's foremost housing ministry celebrated Jordan's life and legacy.
"Clarence Jordan was the spiritual father of the ministry we know today as Habitat for Humanity," said Millard Fuller, founder and president of Habitat for Humanity International (HFHI). "He constantly reminded me that Jesus called on us to love our neighbors as we love ourselves," Fuller said.
"Then, as now, housing was a relevant issue in Americus and Sumter County. So Clarence would say, 'If your neighbor is living in miserable conditions but you have a decent place to live, you certainly aren't loving your neighbor as yourself. You'd better get busy and help them have a decent place to live,'" Fuller said.
Hundreds of members of the HFHI staff and volunteer community gathered to dedicate the Clarence Jordan Center, the office building at 121 Habitat St., Americus, formerly HFHI's headquarters, still in active service as an office center for Habitat's growing staff.
One of the most engaging and controversial figures in Georgia history, Jordan was a widely admired Bible scholar, speaker, writer and farmer. He founded Koinonia Farm, an interracial community near Americus, Ga., in 1942. Jordan's "Cotton Patch" translations of New Testament books and letters, setting Bible stories in contemporary Southwest Georgia, are still popular.
"While I never had the opportunity to meet Clarence -- I came to Koinonia as a volunteer three months after Clarence died -- I have never heard preaching and teaching that can compare with Clarence's insight and wisdom on applying the teachings of Christ," said Ted Swisher, HFHI's vice president for U.S. affiliates. "Clarence believed that low-income people need capital, not charity, and co-workers, not case workers. While he could not have envisioned it at the time, Habitat for Humanity is fulfilling that dream by providing decent, affordable housing in partnership with God's people in need."
Dedicated to eliminating poverty housing, Habitat for Humanity International is an ecumenical Christian ministry founded by Millard Fuller along with his wife, Linda. HFHI and its 1,916 affiliates in 64 nations have built and sold more than 80,000 homes to partner families at no profit with zero-interest mortgages.


text:
64GB Microsoft Surface RT Tablet (pre-owned) for $189.99
@ cowboom.com | 0 comments | microsoft, surfacert, 64gb
6 days ago
Acer Iconia W510-1666 10.1" 64GB Tablet with Windows 8 (Factory Refurbished) for $299.99 + $5.00 shipping
@ moofi.woot.com | 0 comments | acer, iconia, 10.1", 64gb, tablet
6 days ago
Asus TF700T-C1-CG Transformer Pad Infinity 10.1" 64GB Tablet - Champagne (Open Box) for $409.99 + $5.00 shipping
@ moofi.woot.com | 0 comments | asus, transformer, 10.1", 64gb, tablet
24 days ago
Patriot PSF64GSDXC10 LX Series SDXC Flash Card - 64GB, Class 10 at for $24.99
@ tigerdirect.com | 0 comments | electronics, sdxc, 64gb, memorycard
2 months ago
PNY 64GB Attaché 2 USB 2.0 Flash Drive P-FD64GATT2-GE for $19.99 + free shipping
@ macmall.com | 0 comments | computer, usb, macmall, 64gb
2 months ago
Patriot LX 64GB Secure Digital Extended Capacity (SDXC) Flash Card Model PSF64GSDXC10 for $27.99 + free shipping
@ newegg.com | 0 comments | patriot, 64gb, sdxc, photo, flash
2 months ago
Apple MC707LL/A 64GB iPad with Wi-Fi - Black -3rd Generation (Open Box) for $389.99 + $5.00 shipping
@ moofi.woot.com | 0 comments | apple, 64gb, ipad, wi-fi, black
3 months ago
Samsung ATIV Smart PC 500T 11.6" 64GB Slate Tablet (Tablet Only) (Open Box) for $322.99 + $5.00 shipping
@ moofi.woot.com | 0 comments | samsung, 11.6", 64gb, slate, table
3 months ago
Silicon Power Elite 64GB microSDXC UHS-1 Flash Memory Card (SP064GBSTXBU1V10-SP): Computers… for $34.95 + free shipping
@ amazon.com | 0 comments | microsdxc, sd, card, 64gb
4 months ago
Patriot PSF64GSDXC10 LX Series SDXC Flash Card - 64GB, Class 10 for $39.99
@ tigerdirect.com | 0 comments | electronics, 64gb, hunter
4 months ago
PNY Professional X 64GB SD (SDXC) Class 10 Memory Card for $29.99 + free shipping
@ staples.com | 0 comments | electronics, sdxc-card, 64gb
4 months ago
Lexar™ S73 USB 3.0 JumpDrive® 64GB, Green for $25.49
@ officedepot.com | 0 comments | electronics, flash-drive, 64gb
4 months ago
Patriot S•Mini 64GB USB3.0 Flash Drive Model PSF64GSMUSB for $29.99 + free shipping
@ newegg.com | 0 comments | electronics, usb, 64gb, flash-drive
6 months ago
Centon 64GB DataStickPro USB 2.0 Flash Drive and Total Defense Premium Internet Security Bundle at for $1.99
@ tigerdirect.com | 0 comments | flash, drive, usb, 64gb
6 months ago
Kingston DataTraveler 64GB USB 2.0 Flash Drive for $35.99 + free shipping
@ newegg.com | 7 comments | kingston, flash-drive, 64gb
8 months ago
Super Talent 64GB SDXC Flash Memory Card Model SDXC-64GB for $31.49 + free shipping
@ meritline.com | 0 comments | 64gb, flash, memory, computers, electronics
9 months ago
9 months ago
Patriot Supersonic Rage XT 64GB USB 3.0 Flash Drive (PEF64GSRUSB): Computers & Accessories for $63.79 + free shipping
@ amazon.com | 1 comment | computer, flash-drive, 64gb
10 months ago
Verico Evolution MK II- 64GB USB 3.0 Flash Drive Model- TM05 for $38.99 + free shipping
@ newegg.com | 0 comments | usb-3.0, flash-drive, 64gb
a year ago
Patriot Memory EP Series 64 GB Class 10 SDXC 3.0 for $39.99
@ buydig.com | 0 comments | electronics, 64gb, sd-card
a year ago
Verbatim Black Pinstripe 64GB Flash Drive (with code) for $23.99
@ officemax.com | 8 comments | electronics, 64gb-flash-drive
a year ago
64GB SanDisk Ultra SDXC UHS-I Class 10 Flash Memory Card for $44.99 + free shipping
@ buy.com | 0 comments | electronics, 64gb, flash, card, sd
a year ago
Apple iPad 2 64GB W-Fi + 3G Verizon for $399 + free shipping
@ dailysteals.com | 0 comments | apple, ipad, 2, 3g, 64gb
a year ago
EMTEC C400 Candy Series 64 GB USB 2.0 Flash Drive (Green) for $24.99 + free shipping
@ officemax.com | 0 comments | usb, flash-drive, 64gb, thumb, drive
a year ago
Hip Street - 64GB USB 2.0 Flash Drive - HS-USB03-64GB for $34.99 + free shipping
@ bestbuy.com | 0 comments | computers, flash-drive, usb, 64gb
a year ago
64GB, Class 10 Patriot SD Card for $37.99
@ tigerdirect.com | 0 comments | electronics, 64gb, sd, card, patriot
a year ago
SAMSUNG 830 Series MZ-7PC064D/AM SATA III 64GB SSD for $49.99 + $6.98 shipping
@ newegg.com | 0 comments | computer, ssd, samsung, 64gb
a year ago
Apple iPad 2 16GB WiFi 9.7" Tablet - Black or White (Refurb) for $299.99 + free shipping
@ item.ebay.com | 0 comments | electronics, 32gb, 64gb, 3g
a year ago
Sponsored Deals
They're like ads, but good.
OK, yes, companies pay a little something to be Sponsored Deals. But we don't allow just any old crap in this section. Sponsored Deals are proposed to us by other retailers, manufacturers, and even other daily deal sites. If we find the deal compelling enough that our members will appreciate us bringing it to their attention, we'll feature it here. Believe it or not, we have a reputation to uphold. If your store would like to be considered for this space, please contact us for details. But if your deal is lame, or sketchy, no amount of money will let you buy your way in.
Community Deals
It's whatever you want it to be.
Pretty much, anyway. This is where you find the deals that wooters like you have ferreted out and brought to light. We're thinking it'll turn into a massive database of discounted products from around the Web, constantly expanding to absorb the newest deals from the very moment their prices are slashed, with each deal immediately rated by hordes of savvy voters to spotlight the very greatest deals in the world today. Hey, we can dream, right?
We use a fancy algorithm to determine which deals are catching the most buzz – they're under the Popular tab, which is the default view of this section. You can look for the most popular deals today, this week, or this month. The Fresh tab features the most recently submitted deals, so that's where to look for deals that everybody else doesn't know about yet. And the Search bar does what a Search bar does, only, uh, much wootier! Yeah! Right on!
Ask The Community
They probably won't bite.
Organic bullets? Vegetarian haggis? Cheap tickets to Antarctica? The best high-performance sweatsocks for under $100? If you're looking for a deal that doesn't appear to show up in our Community Deals section, throw the question to your fellow cheapskates. Or answer a question for one of your fellow cheapskates. Or vote for your favorite questions, or your favorite answers, or… maybe we should call this section "Ask, Answer, Comment On, And Vote In The Community", but that won't fit on the page.


text:
Iteratee/Enumeratee is a way to process data --
file bytes, network datagrams or matrix elements -- incrementally,
declaratively and with tight resource control. The approach has been
inspired by fold
, parser/printer combinators and circuit diagrams.
There are several variants of the Iteratee-based I/O, available as
independent libraries on Hackage or as part of bigger applications
such as web servers. Here we give motivation, justification and
explanation, pointing out earlier and experimental versions as well as
related projects.
We exposit programming with iteratees, contrasting them with Lazy IO
and the Handle-based, stdio
-like IO. We relate them to online
parser combinators. We introduce a simple implementation as free
monads, which lets us formally reason with iteratees. As an example,
we validate several equational laws and use them to optimize iteratee
programs. The simple implementation helps understand existing
implementations of iteratees and derive new ones.
IterDemo.hs [14K]
IterDemo1.hs [28K]
Demonstrations of Iteratee IO on a sequence of progressively larger examples. The second demo, which is described in the paper, illustrates Iteratee IO in contrast with Lazy and Handle IO.
IterDeriv.hs [11K]
IterDerivM.hs [17K]
Derivations of a simple Iteratee IO. Both derivations use a free monad and treat iteratees as a final co-algebra. The second file derives effectful iteratees. The second file also contains complete proofs of the equational laws of iteratees described in the paper. The files also illustrate iteratees as parser combinators.
talk-FLOPS.pdf [175K]
The annotated slides of the talk presented at FLOPS 2012 in Kobe, Japan on May 24, 2012.
IterDem.hs [16K]
The talk used a veneer over IterateeM to better explain Iteratees. This file is the complete code used in the talk.
IterateeIO-talk.pdf [159K]
IterateeIO-talk-notes.pdf [194K]
Old talks about Iteratee IO
The first version of the talk was presented at DEFUN08, ACM SIGPLAN 2008 Developer Tracks on Functional Programming. September 27, 2008. Victoria, Canada.
The present version of the talk (given at the research colloquium of the Center for Software Technology, Department of Information and Computing Sciences, Utrecht University on December 17, 2009) describes the December 2009 version of the Iteratee IO.
The slides have been updated for the November 2010 version of IterateeM.
The talk is aimed at practitioners not afraid of Haskell, in particular, server programmers. That is, programmers who program long-running distributed applications and are painfully aware of the issues of reading from sockets, latency, buffering, many layers of decoding, proper resource disposal and sustaining high load.
README.dr [4K]
Description of the Iteratee IO library and the code accompanying the talk.
Lazy-vs-correct.txt [5K]
Lazy vs correct IO: A message on composability and performance of Iteratee IO, posted on the Haskell-Cafe mailing list on Thu, 18 Sep 2008 23:51:59 -0700 (PDT).
We show that although the Iteratee IO library is not optimized at all, it already outperforms Lazy IO. The final benchmark, counting words in all GHC documentation, demonstrates the differences between Lazy and Iteratee IO: Iteratee IO finishes the test whereas Lazy IO runs out of file descriptors.
data Stream el = EOF (Maybe ErrMsg) | Chunk [el]Stream is a (continuing) sequence of elements bundled in Chunks. The
variant tells that no more data will be coming: the stream
is exhausted, either due to EOF or some error.
Chunk [a]
gives the currently available part of the stream.
In particular, Chunk []
signifies a stream with no immediately available
data but which is still continuing. When a stream processor
receives such empty chunk, it should ``suspend itself'' --
indicate its desire for more data.data Iteratee el m a = IE_done a | IE_cont (Maybe ErrMsg) (Stream el -> m (Iteratee el m a, Stream el))Iteratee is a generic stream processor -- what is being folded over a stream. An iteratee exists in one of the three states:
We assume that all iteratees are `good' -- given bounded input, they do the bounded amount of work and take the bounded amount of resources. Given a terminated stream, an iteratee should move to the done state, returning the results computed so far.
It turns out, iteratee forms a monad and a monad transformer. After all,
Stream is a gradually consumed state; to read another chunk, the
iteratee has to make an `operating system call' to the stream
producer. Iteratee is a State and Cont monad, and hence an Error
monad. We can write iteratees in the familiar do
The shown type of iteratees is not the only one possible;
the comments in the source code debate two other choices.
type Enumerator el m a = Iteratee el m a -> m (Iteratee el m a)Enumerator is an encapsulation of a data source, a stream producer -- what folds an iteratee over the stream. An enumerator takes an iteratee and applies it to the stream data as they are being produced, until the source is depleted or the iteratee said it had enough. After disposing of buffers and other source-draining resources, enumerator returns the final value of the iteratee. Enumerator thus is an iteratee transformer.
Iteratees and enumerators operate over a base monad m
, allowing
producers and consumers side-effecting actions
to obtain and digest data (e.g., reading or writing files).
That base monad is often IO
. That is not the only choice:
Iteratee el IO
is a monad too; it too may act as the
base monad. If we instantiate the type of Enumerator el m a
choosing m
to be the iteratee monad, we obtain Enumeratee:
type Enumeratee elo eli m a = Iteratee eli m a -> Iteratee elo m (Iteratee eli m a)Enumeratee, as any other enumerator, produces a stream, of the elements of type
. Since an enumeratee acts in the monad Iteratee
el IO
, it may grab chunks of elo
elements and use them as the
source of its own stream. Thus enumeratee is a generic stream
decoder. Stream decoding, or nested parsing, is rather common:
buffering, character encoding, compression, encryption, SSL are just
a few examples. The TIFF library relies on enumeratees,
to decode a stream of bytes from a TIFF file, to the stream
of 2- or 4-byte signed integers and then, for example, to the stream
of rational numbers (the image resolution).Concerns indeed separate: enumerators know how to get to the next element; iteratees know what to do with the next element. The character of Iteratees is the encapsulation of input processing layers that can be freely composed.
The November 2010 version of the code adds guidelines for writing
simple iteratees and enumerators. The library uses standard
combinators such as monadic bind to build iteratee chains;
there are no more $$
and >>==
IterateeM.hs [53K]
Monadic and general iteratees: the main library. Examples of chunk-decoding and IO multiplexing.
Wc.hs [12K]
Many examples of nested and parallel processing of input stream.
IterateeMCPS.hs [39K]
The CPS variant of the January 2010 version of IterateeM.hs
Iteratee IO: safe, practical, declarative input processing
Parallel composition of iteratees: one source to several sinks
Parallel composition of streams: several sources to one sink
Using Iteratee as a base monad to process several streams, at different speeds and inter-dependently.
-notation. Composing enumerators --
stream producers -- gives the producer for the concatenated
stream. Stream transformers, enumeratees, are consumers and
producers at the same time and so are often regarded as complex. A
more general view on Iteratee IO gives a simpler picture: stream
consumers are monads, and stream producers are monoids. Stream
combinators become fewer in number but clearer in semantics --
demonstrated by the examples of three different ways of composing
(lists of) stream producers below.
Iteratees are akin to getChar
and getLine
from the standard
library, parsing the implicit stdin
-like stream. Like
, iteratees transparently take care of buffering and error
handling. The stream `handle' is always implicit, and hence cannot be
prematurely closed. Iteratees are more general than System.IO
readers since iteratees' stdin
is not restricted to a character
stream. The type of iteratee stream elements e
is part of the
Iteratee type. Compare the signatures of the corresponding functions
that extract the current element of the stream:
System.IO.getChar :: IO Char IterateeM.head :: Monad m => Iteratee e m eIteratees are not restricted to the IO monad either: the iteratee
above works in any monad and is
therefore pure. We give iteratees a short alias, whose name should
become clear shortly:type R e m = Iteratee e mWriting iteratee programs should be just as familiar as writing
programs, only without the restrictions on the type of
stream elements and the monad.
The stream consumed by getChar
is produced by the the Haskell
run-time system, which is part of the Haskell environment rather than
of a Haskell program. Iteratee IO brings the producers inside, letting
the program itself produce streams and connect producers with
consumers. A stream producer takes a consumer (a parser of
the stream of e
s into a value of some type a
), feeds it stream
data and returns the resulting consumer.
type Enumerator e m a = R e m a -> m (R e m a)A producer encapsulates stream generation; a consumer encapsulates stream parsing. A consumer should work with any producer that generates the stream of the right type; correspondingly, a producer should work uniformly with any consumer so long as their stream types match. We enforce the abstraction boundary by requiring the enumerator to be parametric in
, the type of the parsing result. A general
stream producer hence has the following type.newtype L e mi mo = L{unL :: forall a. R e mi a -> mo (R e mi a)}Enumerator is a particular case of
L e mi mo
when mi
and mo
are the same.
The general stream producer L e mi mo
is a monoid:
instance (Monad mi, Monad mo) => Monoid (L e mi mo) where mempty = L return mappend (L e1) (L e2) = L $ \i -> e1 i >>= e2It becomes intuitive that composing (or,
ing) enumerators
effectively concatenates their streams. The parameters mi
and mo
L e mi mo
are monads; moreover, mo
should be the same or `bigger'
than mi
: the producer should do all the effects of the consumer,
and perhaps a few more. The following type class establishes
the partial order on monads: what it means to be `bigger':class (Monad m1, Monad m2) => m1 :>=: m2 where promote :: m2 a -> m1 awith at least the following obvious instances.
instance Monad m => m :>=: m where promote = id instance (Monad m, MonadTrans t, Monad (t m)) => t m :>=: m where promote = lift
A notable particular case of L e mi mo
is the outer monad mo
being R e' m
. The type L e m (R e' m)
describes a producer that gets its
data by reading another stream, of e'
, transforming one or more of e'
into one or more of e
. The type L e m (R e' m)
describes a stream transformer -- an enumeratee! Enumerators and
enumeratees hence unify in the general stream producer.
A producer connects with a consumer by a regular functional
application (after the L
unwrapping). For convenience, we introduce
a right-associative infix operator
L f ||| x = f x
Since an enumeratee is a consumer of the outer, e'
stream, it can
be connected with the producer of that stream. The composition then
acts as a inner stream producer. We obtain a combinator to compose
enumeratees with enumerators or with themselves:
compL :: (mo :>=: m) => L e m mo -> L e' m (R e m) -> L e' m mo compL (L e12) (L e23) = L (\ie' -> e12 (e23 ie') >>= promote . run)
We now demonstrate various compositions on a simple running example
of composing the list of take
takes = [takeL 2, takeL 3, takeL 4](where
is IterateeM.take
wrapped in L
Granted, the example is a bit contrived: normally we want to compose a
variety of enumeratees rather than the single take. On the other
hand, take n
makes a neater example.
First, takeL
, as any stream producer, is a monoid,
and can be mappend
c1 :: Monad m => L e m (R e m) c1 = foldl1 mappend takesWe could have just as well used
is associative. Mappend'ing producers `concatenates' their
sources. Therefore, c1 == take (2+3+4)
. To demonstrate this equality,
we run c1
on a sample input stream [1..15]
, with
as the consumer that reads the whole stream
and returns it as a list.c1r = runIdentity $ run =<< (enum1chunkL [1..15] `compL` c1) ||| stream2list -- [1,2,3,4,5,6,7,8,9]We have composed
with the enumerator enum1chunkL
to obtain the enumerator of the prefix stream, which we then
hook up with the stream2list
The result, in the comments, shows that c1
indeed behaves like
take 9
. The code to run c1
can be written differently but equivalently
asc1r' = runIdentity $ run =<< enum1chunkL [1..15] ||| (runI =<< c1 ||| stream2list) -- [1,2,3,4,5,6,7,8,9]Instead of composing
with the producer enum1chunkL
on the right we
composed it with the consumer stream2list
on the left, which leads
to another way of composing takes
The second method of composing enumeratees is to apply each to
a consumer and compose the results.
If e_j
is a producer and i
is an iteratee (for the inner stream), (e_i ||| i)
is an iteratee for the outer stream. A list of such iteratees
can be composed in several ways, sequentially:
c2s :: Monad m => R e m a -> R e m [a] c2s = \i -> sequence $ map (\e -> runI =<< e ||| i) takes c2sr = runIdentity $ run =<< enum1chunkL [1..15] ||| c2s stream2list -- [[1,2],[3,4,5],[6,7,8,9]]or in parallel:
c2p :: Monad m => R e m a -> R e m [a] c2p = \i -> parallel $ map (\e -> runI =<< e ||| i) takes where parallel [i] = liftM (: []) i parallel (i:t) = do (iv,tv) <- enumPair i (parallel t) return (iv:tv) c2pr = runIdentity $ run =<< enum1chunkL [1..15] ||| c2p stream2list -- [[1,2],[1,2,3],[1,2,3,4]]
Finally, enumeratees compose `telescopically':
enumeratees are stream transformers and can be arranged, by compL
, into a
pipeline -- very much like the Unix shell pipeline -- to transform stream
elements further and further. We have seen compL
in action already, in
the term c1r
, which composed an enumerator for the stream e'
with a e'
enumeratee giving the enumerator
for the stream e
-- compare with c1: compL vs mappend c4 = foldl1 compL takes
(again, foldr1
works just as well).
Piping take n_j
into each other is not very interesting. It is
easy to see that the result is equivalent to the single
take (minimum [n_1,...n_j])
. Indeed, c4
behaves like
take (minimum [2,3,4]) == take 2
c4r = runIdentity $ run =<< enum1chunkL [1..15] `compL` c4' ||| stream2list -- [1,2]
We have shown a general view on Iteratee IO that unifies enumerators and enumeratees as general stream producers. Whereas iteratees, stream consumers, are monads and monad transformers, stream producers are monoids -- which gives numerous ways of composing them.
Compose.hs [5K]
The older code using the Iteratee library without any embellishments. It was originally posted as Re: Composing a list of Enumeratees on the Haskell-Cafe mailing list on Fri, 7 Oct 2011 23:27:40 -0700 (PDT).
We use random and binary IO to write a general-purpose TIFF library. The library emphasizes incremental processing, relying on iteratees and enumerators for on-demand reading of tag values. The library extensively uses nested streams, tacitly converting the stream of raw bytes from the file into streams of integers, rationals and other user-friendly items. The pixel matrix is presented as a contiguous stream, regardless of its segmentation into strips and physical arrangement.
We show a representative application of the library: reading a sample TIFF file, printing selected values from the TIFF dictionary, verifying the values of selected pixels and computing the histogram of pixel values. The pixel verification procedure stops reading the pixel matrix as soon as all specified pixel values are verified. The histogram accumulation does read the entire matrix, but incrementally. Neither pixel matrix processing procedure loads the whole matrix in memory. In fact, we never read and retain more than the IO-buffer-full of raw data.
Version 2.0 of the library demonstrates restartable exceptions to seek (that is, control the position) in a stream.
Tiff.hs [19K]
TIFF library
TiffTest.hs [8K]
A sample application of the TIFF library
Feeding several parallel consumers off the same stream is quite
common. Examples include Unix tee
, tcpdump
and similar
wire-tapping commands; reading a stream of numbers and computing the
average and the variance, which requires keeping the count of the
numbers, of their sum and the sum of their squares. Our running example
is even more familiar: Unix wc
command, which reports the number of
lines, words and characters in its input stream or files.
The input data may come from the network or a pipe, which we cannot rewind and re-read. We should handle large input, fast; storing received data in memory or files for re-processing is not an option either. We really have to process data incrementally and in parallel.
The combinator enumPair
composes two iteratees in parallel, turning a pair
of iteratees into an iteratee for a pair of their results:
enumPair :: Monad m => Iteratee el m a -> Iteratee el m b -> Iteratee el m (a,b) enumPair i1 i2 = enum2 i1 i2 >>= runI2One should not confuse
with the lifted pair:
enumPair i1 i2
composes the iteratees i1
and i2
in parallel,
feeding the same chunk of input to both of them. In contrast,
liftM2 (,) i1 i2
composes the iteratees sequentially, feeding
the stream only to i1
, with i2
getting the left-over
after i1
is finished.
The combinator enumPair
is expressed in terms of enum2
a signal-splitter--like enumeratee with one source and two sinks.
enum2 :: Monad m => Iteratee el m a -> Iteratee el m b -> Iteratee el m (Iteratee el m a, Iteratee el m b)The enumeratee splits the stream without any buffering, passing the received chunk to both iteratees, before asking for the next chunk. The enumeratee continues for as long as there are stream data and at least one of the iteratees wants them.
Our running example is like wc
, reporting the number of words and characters
in a given file. It can be elegantly written with Lazy IO:
main_words_char_lazy = do name:_ <- getArgs file <- readFile name print $ (length $ words file, length file)Here is the same code using iteratees:
main_words_char_iter = do name:_ <- getArgs counter <- run =<< enum_file name ((runI =<< enum_words stream_count) `enumPair` stream_count) print counterThe iteratee
counts the elements in its stream;
we apply it to the stream of characters produced by enum_file
to the stream of words produced by decoding the character stream.The ugly side of Lazy IO turns up when we run the code. As the size of the input file increases, from 2.4MB, to 4.9MB, to 24.8MB, so does the peak memory use of the lazy IO code: from 43MB to 78MB and finally, 337MB. Maximal residency grows too: from 20MB to 37MB and 163MB. The program must be reading the whole file in memory. That is not acceptable: we should not need 1/3-Gigabyte of memory to count words and characters in a 25-Megabyte file.
In contrast, the iteratee-based code counts in constant memory: the peak memory use is 2MB and the maximal residency is 108KB -- regardless of the size of the input file.
I am grateful to John Lato for introducing parallel composition and describing its advantages.
Recall that Iteratee el m
is a monad and so can
be used as a base monad of another iteratee. That is how
we derived enumeratees. We now observe that
Iteratee el
is also a monad transformer. We can transform
any monad into an Iteratee monad -- including the iteratee
monad. Laying iteratee monad transformers upon each other gives an
us access to several streams at once.
A simple example of returning the first elements from two streams should make it concrete. Neither stream should be read beyond the first element. The most naive code works:
i1 :: Monad m => Iteratee el1 (Iteratee el2 m) (el1, el2) i1 = do e1 <- head e2 <- lift head return (e1,e2)All signatures hereafter can be and have been inferred; we write them for clarity. The signature indeed clarifies that the iteratee
gets the element of the type el1
from the inner stream,
and the element of the type el2
from the base monad, which
happens to be iteratee as well and so can read from (its own)
Since i1
is an iteratee, we can pass it to an enumerator. The nesting
of streams becomes apparent in the (inferred) signature:
the inner stream contains Int
s and the outer stream has elements
of the type el2
t11 :: (Monad m) => Iteratee el2 m (Iteratee Int (Iteratee el2 m) (Int, el2)) t11 = enum_pure_1chunk [1::Int,2,3,4] i1We complete the inner enumeration by running it. The type of
shows the result to be an iteratee, of an outer stream.
We may pass it to a suitable enumerator (see t13
) and run it:t12 :: (Monad m) => Iteratee el2 m (Int, el2) t12 = run =<< enum_pure_1chunk [1::Int,2,3,4] i1 t13 :: (Monad m) => m (Iteratee Char m (Int, Char)) t13 = enum_pure_1chunk "5678" $ run =<< enum_pure_1chunk [1::Int,2,3,4] i1 t14 :: (Monad m) => m (Int, Char) t14 = run =<< (enum_pure_1chunk "5678" $ run =<< enum_pure_1chunk [1::Int,2,3,4] i1)Running the complete example,
runIdentity t14
, gives us the pair
, the heads of the two streams. With different enumerators
we can verify that neither stream has been read beyond the first
We may even process two streams interdependently,
reading incrementally and by various amounts. The amount to read
from one stream may depend on what we have read from the other.
For example, we will read the n
-th word from the file test2.txt
and find the first line in the file test1.txt
with that word. We return the line paired with the word.
zwl :: (MonadIO m) => Int -> Iteratee String (Iteratee Line m) (Line, String) zwl n = do drop n -- Drop the words from the word stream before we w <- head -- get the desired n-th word liftIO $ putStrLn $ "Got the word: " ++ w -- From the line stream, drop the lines that -- do not contain the word w lift $ dropWhile (not . isInfixOf w) -- Read the first line that does contain w l <- lift $ head return (l,w)We pass the two-stream iteratee
first to the enumerator
of the inner stream of words, tzwlI
, and then to the enumerator
of the outer stream of lines, tzwlO
. We run the whole computation
and print the result:tzwlI :: (MonadIO m) => Int -> Iteratee Line m (Line, String) tzwlI n = run =<< enum_file_gen "test2.txt" (runI =<< enum_words (zwl n)) tzwlO :: (MonadIO m) => Int -> m (Line, String) tzwlO n = run =<< enum_file_gen "test1.txt" (runI =<< enum_lines (tzwlI n)) tzwlO5 = tzwlO 5 >>= printThe traces of read operations show we read both files incrementally, with interleaving, and only as far as needed.
Iterating iteratee transformers is reminiscent of lightweight monadic
regions, which were obtained by iterating ST
transformers. Many-stream iteratees have many similarities with the
regions, including the region-like discipline of allocating and
disposing of stream resources.
Merge.hs [8K]
A two-headed enumeratee: Merging two sorted streams into one sorted stream
The problem well illustrates the reading of two streams at various paces.
How much to read from a stream can be determined only dynamically,
based on the data read from both streams.
We design not merely an iteratee with two input streams;
we design an enumeratee. Thus we truly merge two input streams into a one,
to be processed by inner iteratees as any other stream.
We also process the two input streams by chunks rather than
element-by-element. If a stream can yield several pieces of
data at once, we take advantage of that, improving the performance.
How to zip folds: A library of fold transformers (streams)
The question of parallel processing of several streams is quite
like the question of expressing list zipWith
via list fold.
(Recall the origins of iteratees and enumerators in the left fold.)
If the only way to obtain elements of a list is to fold over it,
could we express the zip function?
At first blush, it seems impossible: after all, zip requires
simultaneous processing of two lists whereas list fold can at best give us
only nested processing. Yet we can write zip using only folds to deconstruct
lists, as the referenced article explains.
Iteratee IO also aims, among other things, to encapsulate resources such as file handles and network connections, ensuring their safe use and prompt disposal. One may wonder how much Iteratees and Regions have in common and if that commonality can be factored out.
There seem to be several ways to combine regions and iteratees. We
describe the most straightforward attempt, combining a
monadic region library (mostly as it is) with an Iteratee IO library,
also mostly as it is. We use monadic regions to manage file handles or
file descriptors, ensuring that file handles are always closed, even in
case of IOError
and other asynchronous exceptions. An enumerator like enumFile
provided similar guarantees for its handles. (Since an
enumerator keeps its handles to itself, there is no danger of
iteratees' misusing them.) With the monadic region library, the
enumerator code becomes simpler: we no longer have to worry about
exceptions. The main benefit of monadic region library is to manage
files opened by iteratees. The latter are being passed around, and so
their resources are harder to keep track.
We stress that monadic regions do not impose the stack-based (LIFO) order on opening and closing of files. The original memory regions were invented to get around the stack allocation, LIFO strategy, which does not suffice because the memory allocation patterns are complex: a function may allocate memory that outlives it. Regions let the programmer create arbitrarily many nested regions; everything in a parent region is available to a child. Crucially, a child may request any of its ancestors to allocate memory in their regions. Therefore, although regions are nested, memory does not have to be allocated and freed in LIFO order. The same principle holds for monadic regions and file handles.
We thus demonstrate enumFile
and in particular iterFile
incremental file reading
and writing, with the same safety guarantees. All opened files are always closed, regardless of any (asynchronous) exceptions that may
arise during opening, reading, writing or transforming. The code has
many examples of throwing errors from various stages of the pipeline and
at various times. All files are closed.
Before looking at iterFile
code, let us first see what it can do.
The first example simply copies one file to another, block-by-clock.
tIF1 = runSIO $ run =<< unL (enumFile "/etc/motd") (iterFile "/tmp/x")
According to the trace
opened file /etc/motd iterFile: opening /tmp/x Closing {handle: /etc/motd} Closing {handle: /tmp/x}the files are indeed closed, but not in the LIFO order. That is important, so to let an iteratee write data coming from several sources. For example:
tIF3 = runSIO $ run =<< unL (enumFile "/etc/motd" `mappend` enumFile "/usr/share/dict/words") (iterFile "/tmp/x") opened file /etc/motd iterFile: opening /tmp/x Closing {handle: /etc/motd} opened file /usr/share/dict/words Closing {handle: /usr/share/dict/words} Closing {handle: /tmp/x}The complex patterns of opening and closing are worth stressing again. For example, the file
is opened first and is closed first.
This is not a stack-allocation strategy.The files will be closed even in case of exceptions:
tIF4 = runSIO $ run =<< unL (enumFile "/etc/motd" `mappend` enumFile "/nonexistent") (iterFile "/tmp/x") opened file /etc/motd iterFile: opening /tmp/x Closing {handle: /etc/motd} opened file /nonexistent Closing {handle: /tmp/x} *** Exception: /nonexistent: openFile: does not exist
The source code demonstrates handling of other exceptions. All monadic
region monads all support shCatch
, so we can write our own
exception-handling code.
Monadic regions simplify the code for enumFile
, which reads data from a
file and feeds to an iteratee. The code relies on the regions library
to ensure the opened file shall be closed, on normal or any exceptional
enumFile :: (SMonadIO m) => FilePath -> L ByteString m m enumFile filepath = L $ \iterv -> do newRgn $ do h <- newSHandle filepath ReadMode unL (enumHandle h) iterv
More interesting is an exception-safe iterFile
, which has been claimed
to be impossible to write. This iteratee saves all received data into a
given file, incrementally. The code is written in the ordinary
monadic style. The file is opened in the region one up: therefore,
the file will remain open after an enumerator is finished with iterFile
Another enumerator may pick up. The file will be closed when iterFile
region is exited.
iterFile :: (SMonad1IO m, m ~ (IORT s' m')) => FilePath -> R ByteString m () iterFile fname = lift (newSHandle fname WriteMode) >>= loop where loop h = getChunk >>= check h check h (Chunk s) = lift (mapM (shPut h) s) >> loop h check h e = return ()
Monadic regions can indeed be combined with an Iteratee library, relieving enumerators and mainly iteratees from worrying about closing files, especially upon exceptions. Although regions constrain patterns of opening and closing, they do not impose the LIFO order. The whole pattern of opening and closing does not even have to be known statically.
SafeHandles.hs [12K]
SafeHandlesTest.hs [10K]
The implementation of the monadic region library, described in Lightweight monadic regions
Composing stream producers
More economical interface to the IterateeM library
The main component of the XML parsing framework is
the Enumeratee xml_enum
that converts from
a Char
stream to an XMLStream
, the stream of parsed XML data.
That is, xml_enum
is a pull, SAX XML parser. Hooking up xml_enum
with a simple iteratee (see below) gives a DOM parser. The
framework also exports a number of low-to-high level lexing and
parsing iteratees for tokenizing or parsing marked-up documents,
in various XML or HTML formats. One may use these "Lego blocks"
to construct a parser following any discipline and performing validation
to any degree.
The interface to the XML parser is through XMLStream
rather than
data XMLStream a = XMLString String String | XMLStart QNameR (AttList QNameR) NameSpaces | XMLEnd QNameR (AttList QNameR) NameSpaces | XMLOther a -- extension, for PI handlerswhere
is a resolved QName
, the name of an element or an
attribute with the resolved (as a URI
) namespace qualification.
The XML DOM parser, which converts XML text to a Document Object Model
(DOM) tree, illustrates xml_enum
and the composability -- stringing up --
of Iteratee-based parsers. It is short enough
to fully describe it here. DOM is a tree representation of the XML document:data DOM = DNode QNameR (AttList QNameR) [DOM] | DC String -- Character data
The iteratee xml_dom_iter
, whose complete code shown below, builds the tree
from the XMLStream
. The xml_dom_iter
signature says so directly.
xml_dom_iter :: Monad m => Iteratee (XMLStream ()) m DOM xml_dom_iter = head >>= \x -> case x of XMLString s "" -> return $ DC s XMLStart{} -> forest [] -- XMLEnd is not expected; neither is EOF where forest acc = head >>= \x -> case x of XMLString s "" -> forest $ DC s : acc XMLStart{} -> forest [] >>= forest . (:acc) XMLEnd name attrs _ -> return $ DNode name attrs $ reverse accThe full DOM parser is obtained by connecting
to xml_dom_iter
:xml_dom :: Monad m => Iteratee Char m DOM xml_dom = id .| xml_enum default_handlers .| xml_normalize xml_dom_iterThe argument
provides no PI handlers and no pre-defined
parsed entities or namespaces. The pipeline includes xml_normalize
to coalesce adjacent character content and to remove white space between
elements. Although such white space is almost always insignificant,
its removal is not standard. Therefore, it is separated into its own
enumeratee.The Iteratee XML parsing framework is based on the SSAX XML parser implemented in Scheme. The main difference is the stream-based interface, making incremental parsing much easier to use. The SSAX parser relied on call-backs, which had to manually manage their internal state, repeatedly packing and unpacking it. Call-backs were therefore unwieldy, error-prone, and difficult to compose.
XMLDom.hs [14K]
A sample application and a demonstration of the SAX XML parser: DOM XML parser
The bulk of the file are the unit tests of the parser, including the tests of namespaces and parsed entities.
SearchString.hs [4K]
A general-purpose iteratee to search the stream for a given string
This iteratee does no buffering and never reads (ahead) more than really necessary to locate the string.
Functional XML parsing framework in Scheme: SAX/DOM and SXML parsers with support for XML Namespaces and validation
The Scheme parser was the prototype and the inspiration for the present XML Enumerator.
The problem is common: suppose we receive an XML document over a network (e.g., in an HTTP stream). Network connections are inherently unreliable and can be dropped at any time. The XML document therefore can come truncated, for example, missing the end tag for the root element. According to the XML Recommendations, such document is ill-formed, and hence does not have an Infoset. In contrast, invalid but well-formed documents -- with all tags balanced but expected integral data does not parse as such -- do have the Infoset. Strictly speaking, we should not be using data from an XML document until we verified that it is well-formed, that is, until we parsed it at all and have checked that all end tags are in place. Incremental XML processing seems impossible.
Sometimes people avoid such a strict interpretation and process a document as far as they can. For example, the XML-encoded telemetry may be regarded meaningful even if the root end tag is missing.
Even in the strict interpretation, it is still possible to handle a document incrementally so long as the processing is functional or its side effects can be backed out (e.g., in a transaction). We demonstrate such an incremental processing that always detects ill-formed XML, and, optionally, invalid XML. It is possible after all to detect ill-formedness errors and process the document without loading it all in memory first -- using as little memory as needed to hold the state of the processor (just a short string in our example).
Our running example is an XML document representing a finite map: a collection of key-value pairs with an integer key:
<map> <kv><key>1</key><value>v1</value></kv> <kv><key>2</key><value>v2</value></kv> <kv><key>bad</key><value>v3</value></kv>This document is both ill-formed (missing the end tag) and invalid (one key is bad: non-
-able). The goal is to write a
lookup function for a key in such an encoded map reporting all
ill-formedness errors, always. We may choose not to report an
invalid key if the lookup succeeds before the bad
key is
encountered.The following pipeline is the answer:
type Key = Int type Value = String xml_lookup :: Monad m => Key -> Iteratee Char m (Maybe Value) xml_lookup key = id .| xml_enum default_handlers .| xml_normalize .| kv_enum (lkup key)The expression
xml_lookup key
is the iteratee that consumes characters
and produces a Value
associated with the given Key
, or Nothing
if the lookup fails. Alternatively, the expression may throw an iteratee
error. The function xml_lookup
is built
by composition from smaller, separately developed and tested
pipeline components; xml_enum
, the XML enumerator, and xml_normalize
are part of the incremental XML parsing framework:xml_normalize :: Monad m => Enumeratee (XMLStream x) (XMLStream x) m a xml_enum :: Monad m => Handlers x m a -> Enumeratee Char (XMLStream x) m aThey parse an XML document incrementally and produce the stream of parsing results -- detecting ill-formed documents and raising corresponding errors. The ill-formedness check is hence taken care of, by the framework.
The enumeratee kv_enum
just as incrementally transforms the stream of
parsing results to the stream of key-value pairs:
kv_enum :: Monad m => Enumeratee (XMLStream ()) (Key,Value) m a kv_enum = parse_element (name "map") map_parser where map_parser n iter = parse_many (name "kv") kv1 iter >>= finish_element n kv1 n iter = do key <- parse_element (name "key") (\n _ -> as_readable n) 0 val <- parse_element (name "value") (\n _ -> as_str n) "" yield_to iter (key,val) >>= finish_element nThe enumeratee relies on a simple DTD parser combinator library. Here,
parses the stream (<kv>...</kv>)*</map>
and kv1
handles <key>
. This enumeratee parses
the stream till the end and hence always reports validation errors,
of a key unredable as an integer.
Finally the iteratee lkup
looks up the given key in the stream of
key-value pairs:
lkup :: Monad m => Key -> Iteratee (Key,Value) m (Maybe Value) lkup key = headM >>= check where check (Just (k,v)) | k == key = return (Just v) -- premature termination check Nothing = return Nothing check _ = lkup key
Applying xml_lookup 2
to the sample XML document returns the error
``XML [43] (EOF) broken for element map. Stream after the error: ""''. If we
add the closing tag </map>
we still get an error,
``Reading failure. Stream after the error:
[XMLStart value (fromList []) (fromList []),XMLString "v3" "",....]
because the key bad
cannot be parsed as integer. If we change kv_enum
slightly so that it stops parsing as soon as its client iteratee
is done, then xml_lookup 2
on the sample document, with the closing </map>
added, returns Just "v2"
. The lookup succeeded
before the bad key is encountered.
We have thus demonstrated constant-space processing -- lookup in an XML document -- while detecting all XML parsing errors. The error reporting comes `for free' , courtesy of the XML parsing framework. The whole processing is a pipeline of several stages, each incremental, each with its own error-reporting.
. The code contains a simple
library of parsing combinators, which represent the element
structure (`DTD').for-each
, map
, filter
higher-order procedures -- of which the most general is fold
. The second approach relies on streams, a.k.a. cursors, lazy lists. Generators such as the ones in Icon, Ruby and Python are a hybrid approach.It is well-known that given a cursor interface to a collection, we can implement an enumerator. It is less appreciated that given an enumerator interface, we can always derive a cursor -- in an automatic way. We demonstrate that generic procedure for languages with and without first-class continuations.
Now that cursors and enumerators are inter-convertible, an implementor of a collection has a choice: which of the two interfaces to implement natively? We argue that he should offer the enumerator interface as the native one. The paper elaborates that enumerators are superior: in efficiency; in ease of programming; in more predictable resource utilization and avoidance of resource leaks. We present a design of the overall optimal collection traversal interface, which is based on a left-fold-like combinator with premature termination. The design has been implemented and tested in practice.
Generic Zipper: the context of a traversal
The article arose during the discussion of a good database
interface for Oracle. For portability, the article illustrates the
enumerator inversion technique on an example of a file, regarded as a
collection of characters. Haskell already provides a stream interface to that
collection: hGetChar
. We implement a left fold
enumerator, and turn it back into a stream, implementing a function myhgetchar
exclusively in terms of the left fold enumerator.
Towards the best collection traversal interface
This extended abstract of a LL3 presentation lists the advantages of enumerators for traversing collections and discusses the enumerator inversion procedure in the broad context.
Parallel composition of streams: several sources to one sink
A different, and better way to interleave two folds
io.txt [26K]
An early draft of an ambitious layered IO proposal, cast in the context of Scheme. More polished drafts exist, and even a prototype Scheme implementation. Unfortunately, once it became clear that the ideas are working out, the motivation fizzled.
A stream-wise access to a collection is an important access method, which may even be supported by hardware. For example, Pentium III floating-point extension (Internet Streaming SIMD Extension) lets programmers designate arrays as streams and provides instructions to handle such data efficiently (Internet Streaming SIMD Extensions, Shreekant (Ticky) Thakkar and Tom Huff, Computer, Vol. 32, No. 12, December 1999, pp. 26-34). Streaming is a typical memory access model of DSPs: that's why DSP almost never incorporate a data cache (See "DSP Processors Hit the Mainstream," Jennifer Eyre and Jeff Bier, Computer, Vol. 31, No. 8, August 1998, pp. 51-59). A memory architecture designed in an article "Smarter Memory: Improving Bandwidth for Streamed References" (IEEE Computer, July 1998, pp.54-63) achieves low overall latencies because the CPU is told by a compiler that a stream operation is to follow. LinAlg offers this streaming access model to an application programmer.
Matrix streams may stride a matrix by an arbitrary amount. This lets us traverse a matrix along the diagonal, by columns, by rows, etc. Streams can be constructed of a Matrix itself, or from other matrix views (MatrixColumn, MatrixRow, MatrixDiag). In the latter case, the streams are confined only to specific portions of the matrix.
Many functions of LinAlg are written in terms of streams, for example, the computation of vector norms, the addition of a vector to the diagonal or the anti-diagonal of a matrix, Aitken-Lagrange interpolation. Singular value decomposition SVD demonstrates many applications of streams: e.g., multiplying a matrix by a rotation matrix avoids random access to matrix elements and the corresponding range checks and offset calculations. The stream code is also more lucid. One may create a stream that spans over a part of another stream. We use substreams, for example, to efficiently reflect the upper triangle of a square matrix onto the lower one, yielding a symmetric matrix. The SVD computation uses subranging extensively, e.g., for left Householder transformations.
LinAlg's streams may span an arbitrary rectangular block of a matrix, including the whole matrix, a single matrix element, a matrix row or a column, or a part thereof. Assigning a block of one matrix to a block of another takes only one line -- which, due to inlining, is just as efficient as the direct loop with pointer manipulation.
: Basic Linear Algebra and Optimization classliboleg-at-pobox.com or oleg-at-okmij.org
Your comments, problem reports, questions are very welcome!
Converted from HSXML by HSXML->HTML


text:
Oriental Rugs & Persian Area Rugs | Buy Direct and Save at Rugman
With over 15,000 Persian rugs Oriental rugs and area rugs in stock, Rugman.com is the world's leading retailer of hand-woven and hand-knotted tribal rugs traditional rugs and modern rugs at guaranteed lowest prices. All your Persian & Oriental Rug purchases at Rugman.com are backed by our competitive Persian & Oriental Rug Price Match Guarantee. If you find a current lower price on any rug we have in stock, we will match the price and beat it by 10% - guaranteed!
We have cut out the middleman
Rugman.com offers tremendous value by cutting out the middlemen and purchasing unfinished Persian wool rugs directly from the weavers. We finish Persian carpets in our own facility and ensure total quality control from the loom direct to your room. We bring you unbeatable savings of up to 85% off store prices on every Persian rug and Oriental rug in our inventory. Use a current Rugman Coupon Code for extra savings.
rugman.com Media Relations
Beautiful, long lasting & portable
An area rug is a wise and cost effective decorating choice, particularly in difficult economic times. Authentic Persian rugs and Oriental rugs can increase in value, can last for generations and be transported from home to home. Take it with you when you move, or pass it on to your children-a Persian rug or an Oriental rug will enhance any space!
Offered at every price point and portable, our Persian rugs,Oriental rugs and area rugs add value, charm and elegance to your home. The easy addition of a luxurious tribal rug, traditional rug or modern rug to any room will dramatically change its look and focus.


text: Small in size but huge in the beauty and warmth. Waters and fine sand, the beach offers many attractions for sports and also for simple summer. Has a club doctors in its left end that allows the purchase of food and beverages, good choice. Another option is to get on your preference. Worth knowing much traveling around the north coast... More


text:
Frogout Eat flies and hop around in this end of the world adventure! Frogout is an exciting puzzle/physics game that takes place on a post apocalyptic earth, littered with toxic waste and sludge! Use your tongue to eat every fly on the level to win. 2/7/2013 10:56:54 AM 7,777
Satellite View of World Air Traffic For 24 Hours The yellow dots are airplanes. I bet you didn't know this many planes were up in the sky at any given time. 2/3/2013 11:05:16 AM 19,878
Copter The goal is to try to fly your little helicopter as far as you can by maneuvering it through the green cave. Watch out for the obstacles and don't crash into any of the cavern floors or ceilings. How far can you make it? Post your best score. 1/30/2013 11:40:53 AM 12,723
Time To Change Your Underwear That's a clear sign it's time to change the draws. 1/29/2013 9:18:23 PM 6,462
Airplane Almost Hits Person Filming Not the best place to stand to while filming stunts. 1/22/2013 12:00:00 AM 34,072
The Flying Nut High Five The Jackass guys tried this stunt but never completed it. These kids manage to pull it off. 1/21/2013 12:00:00 AM 16,421
String Wont Stop Parkour Squirrel Squirrels always find a way onto bird feeders. Nothing stops them. 1/1/2013 12:00:00 AM 17,388
Amigo Pancho 3 For Amigo Pancho, the only way is up...with balloons. Create a path for Amigo Pancho to fly with his balloons by interacting with objects and avoiding hazards. 12/18/2012 12:00:00 AM 9,160


text:
Let your Party Sizzle... Get the Fever! Experience. Versatility. Professionalism. We help plan, design & create the time of your life! Elegant ceremonies, sophisticated cocktail hours, spectacular dance celebrations. Authentic & soulful. Definitely not your ordinary party band! The Fever reflects YOUR style. Outstanding!
3 String Groups: Razumovsky Quartet, Triad Trio, Debonair Duo. Clients love us. Why? Our superb sound: warm, professional sound perfectly blended & balanced to make your special day's music fabulous.
Their outstanding lead vocals, tight harmonies and instrumentation (acoustic and electric guitars, bass, guitar, mandolin, drums and percussion) lend themselves to the band's extensive repertoire.
We have a large library of standard wedding music, as well as more obscure pieces for a creative touch. We can even special order or arrange a favorite song for an additional fee.
Colorado Swing performs an exciting variety of great music including classic Big Band Era and Las Vegas show standards as well as popular music arrangements from contemporary artists. We would love to entertain at your wedding or special event. Our full-size big band creates that exciting sound you rarely hear anymore.
We have a monumental repertoire for all occasions which is constantly expanding as we write new arrangements to satisfy our guests' requests.
All the musicians associated with the Fort Collins String Quartet are experienced professional musicians, assuring you a quality performance.
Colin McAllister is a versatile performer whose extensive repertoire includes classical music of all historical periods, flamenco, swing & latin jazz standards, contemporary jazz & popular favorites. His professionalism and attention to details have made him a favorite with brides and wedding planners for over 20 years.