1
1
mirror of https://github.com/github/semantic.git synced 2024-11-29 02:44:36 +03:00
Commit Graph

11 Commits

Author SHA1 Message Date
Patrick Thomson
bdc5db555b rename and prune 2018-11-05 16:56:49 -05:00
Patrick Thomson
7ea52dbfe3 Give Control.Matching API better ergonomics.
Given that @tclem and I have found the matcher API frustrating, I've
taken a stab at improving its ergonomics, and I've found some success
in separating composition of matchers from predicate-based narrowing
thereof.

The biggest change here is the elimination of the old `match`
combinator, which proved to be clumsy in that it complected narrowing
and composition. Top-down matching combinators are now written with
the `need` combinator and the `>>>` combinator, which is more readable
and more versatile. Here's a matcher that accepts functions with
Python docstrings:

```haskell
docstringMatcher :: ( Decl.Function :< fs
                    , [] :< fs
                    , Lit.TextElement :< fs
                    , term ~ Term (Sum fs) ann
                    ) => Matcher term term
docstringMatcher = target <*
               (need Decl.functionBody
                >>> narrow @[]
                >>> mhead
                >>> narrow @Lit.TextElement
                >>> ensure Lit.isTripleQuoted))
```

Pretty readable, right? Each step of the tree regular expression -
choosing function bodies, ensuring said bodies are lists, examining
the first element, and choosing only TextElements containing
triple-quoted strings - is made implicit. The old way would have
looked something like this:

```haskell
docstringMatcher = target <* match Decl.functionBody
                           $ narrow
                           $ matchM listToMaybe
                           $ target <* ensure Lit.isTripleQuoted
```
which is a good deal more disorganized and less flexible
in the quite-common case of applying functions during a
matching pass. Separating the act of composition from
function application is a big win here.

Further comments are inline.
2018-11-02 19:25:29 -04:00
Patrick Thomson
6b476d0eb7 Add 'purely' combinator to Matching and rename it.
@tclem and I found ourselves wanting an arrow-like combinator that
promotes a given function to a Matcher. While I think an Arrow
instance is going a little overboard, there's no harm in adding a
'purely' function, the naming of which is commensurate with the
rewriting DSL.

This also renames the module, since there's not anything really
abstract about matching (indeed, it is quite concrete).
2018-10-30 11:04:11 -04:00
Timothy Clem
278e6890cd Fix up the tests 2018-09-25 11:18:51 -05:00
Patrick Thomson
2998c8f8cc last few changes 2018-09-19 11:03:59 -04:00
Patrick Thomson
efb0b0a0f7 Change Rule to RuleM and PureRule to Rule. 2018-09-18 17:33:01 -04:00
Patrick Thomson
3d1bccc3f4 cleaner tests 2018-09-18 15:45:17 -04:00
Patrick Thomson
9eb7fe5cd8 reenable all the tests 2018-09-18 13:18:31 -04:00
Patrick Thomson
f6f2476641 fix tests 2018-09-17 11:17:10 -04:00
Patrick Thomson
ec7ee9da62 improve JSON formatting so the diff doesn't whine 2018-09-17 10:52:28 -04:00
Patrick Thomson
d1cc400dc0 add spec file 2018-09-14 13:10:22 -04:00