Mercurial > feed
diff src/ur/feed.urs @ 8:a4e5d053daed
Preparation for first release
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Sat, 19 Mar 2011 14:35:11 -0400 |
parents | 05a28a77f6fe |
children | f19beef42ceb |
line wrap: on
line diff
--- a/src/ur/feed.urs Thu Mar 10 18:36:50 2011 -0500 +++ b/src/ur/feed.urs Sat Mar 19 14:35:11 2011 -0400 @@ -1,36 +1,69 @@ +(* This module implements imperative processing of XML feeds. + * + * Module author: Adam Chlipala + *) + con pattern :: Type -> Type -> Type +(* A pattern describes a set of XML subtrees, mapping each element of the set to + * a data value. A value of type [pattern internal result] uses values of type + * [internal] internally, but this API exposes no details of that usage. The + * type [result] gives the type used in mappings of matched subtrees. *) + +val null : pattern unit (variant []) +(* A null pattern matches nothing, returning a value of the impossible empty + * type if it ever does match. *) con tagInternal :: {Unit} -> Type -val null : pattern unit (variant []) - val tag : attrs ::: {Unit} -> folder attrs -> string -> $(mapU string attrs) -> pattern (tagInternal attrs) {Attrs : $(mapU string attrs), Cdata : option string} +(* A basic [tag] pattern matches a single tag with a number of required + * attributes. A result value gives the attribute values and an optional + * CDATA value for the text content of the tag. The [string] argument is the + * tag name, and the following argument gives attribute names. *) val tagA : attrs ::: {Unit} -> folder attrs -> string -> $(mapU string attrs) -> pattern (tagInternal attrs) $(mapU string attrs) +(* A version of [tag] that ignores CDATA *) + val tagAO : attrs ::: {Unit} -> folder attrs -> string -> $(mapU string attrs) -> pattern (tagInternal attrs) $(mapU (option string) attrs) +(* A version of [tagA] that makes each attribute optional *) val tagC : string -> pattern (tagInternal []) string +(* A version of [tag] that only matches tags with nonempty CDATA and returns + * only that text *) con childrenInternal :: Type -> {Type} -> Type val children : parentI ::: Type -> parent ::: Type -> children ::: {(Type * Type)} -> pattern parentI parent -> $(map (fn (i, d) => pattern i d) children) -> folder children -> pattern (childrenInternal parentI (map fst children)) (parent * $(map snd children)) +(* A combinator that takes in a pattern for a parent node and a set of patterns + * that must be matched against children of the parent. This combinator will + * find at most one match per matching parent node. *) + val childrenO : parentI ::: Type -> parent ::: Type -> children ::: {(Type * Type)} -> pattern parentI parent -> $(map (fn (i, d) => pattern i d) children) -> folder children -> pattern (childrenInternal parentI (map fst children)) (parent * $(map (fn (i, d) => option d) children)) +(* A version of [children] where each child pattern need not be matched *) con treeInternal :: Type -> Type -> Type val tree : parentI ::: Type -> parent ::: Type -> childI ::: Type -> child ::: Type -> pattern parentI parent -> pattern childI child -> pattern (treeInternal parentI childI) (parent * child) +(* A combinator that takes in a pattern for a parent node and another pattern to + * be matched at any depth within the parent's subtree. Unlike [children], + * [tree] finds as many subtree matches per parent node as possible. *) type document val show_document : show document +(* Type of uninterpreted XML documents *) -val fetch : string (* url *) -> transaction document +val fetch : string -> transaction document +(* Retrieve a document by URL. *) + val app : internal ::: Type -> data ::: Type -> pattern internal data -> (data -> transaction {}) -> document -> transaction {} +(* Find all matches of a pattern in a document, running an imperative function + * on the data returned by each match. *)