template-haskell-util (empty) → 0.1.0.0
raw patch · 64 files changed
+698/−0 lines, 64 filesdep +basedep +template-haskellsetup-changedbinary-added
Dependencies added: base, template-haskell
Files
- .git/COMMIT_EDITMSG +9/−0
- .git/COMMIT_EDITMSG~ +9/−0
- .git/HEAD +1/−0
- .git/config +14/−0
- .git/description +1/−0
- .git/hooks/applypatch-msg.sample +15/−0
- .git/hooks/commit-msg.sample +24/−0
- .git/hooks/post-update.sample +8/−0
- .git/hooks/pre-applypatch.sample +14/−0
- .git/hooks/pre-commit.sample +49/−0
- .git/hooks/pre-push.sample +54/−0
- .git/hooks/pre-rebase.sample +169/−0
- .git/hooks/prepare-commit-msg.sample +36/−0
- .git/hooks/update.sample +128/−0
- .git/index binary
- .git/info/exclude +6/−0
- .git/logs/HEAD +3/−0
- .git/logs/refs/heads/master +3/−0
- .git/logs/refs/remotes/origin/HEAD +1/−0
- .git/logs/refs/remotes/origin/master +2/−0
- .git/objects/04/4d92ff41144323a5f3560042b11cd4c1ba5e27 binary
- .git/objects/07/0c1131e874660cd0b399ef47d1b858ff8793a0 binary
- .git/objects/11/9bdac5caf8dccdce98352d29af74517692984c binary
- .git/objects/17/a8b7d220ae5394a9369c889384673567f2ffe2 binary
- .git/objects/1d/5ed8a5bd5a630d659dac826f1d251b60317469 binary
- .git/objects/20/ca248c4d12a9cc5a4441bfb342b60922824040 binary
- .git/objects/2f/04dee5ff3b9942714d4746b9d0a8c5d5509085 binary
- .git/objects/42/905a03530679e07e9aeb8c52f5fe1219207e01 binary
- .git/objects/5c/bb9a4d1c9a35dcb29eb3866afb1e33e0c304c9 binary
- .git/objects/64/73929c7950d01d618a45420165c543b8cb4ff2 binary
- .git/objects/6a/35d077429c47159fd674466174acd97eb207b8 +2/−0
- .git/objects/71/2891fcdda0381f84adb48cac21c035028d3a8c binary
- .git/objects/74/a4e672ebf4b930e5dd6b616fa4bc2a02365466 binary
- .git/objects/7a/0cc2115b5d2bdce511903df0ae592ab1ab8c21 binary
- .git/objects/7f/01dc145616f4a53e0a186872830e49bff62efb +3/−0
- .git/objects/83/3b4c60194337adacadea6fed3c2405dddc2bed binary
- .git/objects/85/e0f51a55237cca950296b39f063057a52e85f6 binary
- .git/objects/8c/36a3364b672c8b85244909acf3a06a3501ad33 binary
- .git/objects/8e/2c733e2d82de61adc4fb9ea405eea6adde0477 binary
- .git/objects/94/992aa0ad781e24a35f65e071057a2aa7bef45d binary
- .git/objects/9e/43c01c01365d6d757188b2136789f5726dfac3 binary
- .git/objects/a0/255b994096ec2c541e7257cfc164aa5794c09c binary
- .git/objects/a0/6307868bc41484fbaf1e60913612fa07e47aca binary
- .git/objects/a6/c5ae05a815bab01ab73604faea7d1edfeb91a9 binary
- .git/objects/ac/b473308a531cdd76f5e9f7e643a047a71fafd1 binary
- .git/objects/ad/fc307073786c3dea4d06fcc1733e77bb383c81 binary
- .git/objects/b5/b6ac12670f8ee43b1759402b346d9da60ab066 +1/−0
- .git/objects/c3/c2f2418af9ac6f49318d05c4ab4a8bf3b398f7 +1/−0
- .git/objects/c7/77470c4d808739af195139dafd6041ab19e708 binary
- .git/objects/c9/b3cf02a7c8a4f0c7c556583944579408b3bb74 binary
- .git/objects/d1/247d5c2308a73ca68c144ce67b060d3023b385 +2/−0
- .git/objects/dc/3e4f86c7ead198e6595395057c6836d0e5c0c4 binary
- .git/objects/eb/cdb92439913cc476708cc8ec7920219062a79a +1/−0
- .git/objects/f4/e127a195ff2f05bd5913424e318a2b07cecb8f binary
- .git/objects/f7/1d9b249fecb00850d2ecfb07bae5ebbece36eb binary
- .git/packed-refs +2/−0
- .git/refs/heads/master +1/−0
- .git/refs/remotes/origin/HEAD +1/−0
- .git/refs/remotes/origin/master +1/−0
- LICENSE +20/−0
- README.md +12/−0
- Setup.hs +2/−0
- src/Language/Haskell/TH/Utils.hs +77/−0
- template-haskell-util.cabal +26/−0
@@ -0,0 +1,9 @@+update readme+# Please enter the commit message for your changes. Lines starting+# with '#' will be ignored, and an empty message aborts the commit.+# On branch master+# Your branch is up-to-date with 'origin/master'.+#+# Changes to be committed:+# modified: README.md+#
@@ -0,0 +1,9 @@++# Please enter the commit message for your changes. Lines starting+# with '#' will be ignored, and an empty message aborts the commit.+# On branch master+# Your branch is up-to-date with 'origin/master'.+#+# Changes to be committed:+# modified: README.md+#
@@ -0,0 +1,1 @@+ref: refs/heads/master
@@ -0,0 +1,14 @@+[core]+ repositoryformatversion = 0+ filemode = false+ bare = false+ logallrefupdates = true+ symlinks = false+ ignorecase = true+ hideDotFiles = dotGitOnly+[remote "origin"]+ url = https://github.com/HaskellZhangSong/TemplateHaskellUtils.git+ fetch = +refs/heads/*:refs/remotes/origin/*+[branch "master"]+ remote = origin+ merge = refs/heads/master
@@ -0,0 +1,1 @@+Unnamed repository; edit this file 'description' to name the repository.
@@ -0,0 +1,15 @@+#!/bin/sh+#+# An example hook script to check the commit log message taken by+# applypatch from an e-mail message.+#+# The hook should exit with non-zero status after issuing an+# appropriate message if it wants to stop the commit. The hook is+# allowed to edit the commit message file.+#+# To enable this hook, rename this file to "applypatch-msg".++. git-sh-setup+test -x "$GIT_DIR/hooks/commit-msg" &&+ exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}+:
@@ -0,0 +1,24 @@+#!/bin/sh+#+# An example hook script to check the commit log message.+# Called by "git commit" with one argument, the name of the file+# that has the commit message. The hook should exit with non-zero+# status after issuing an appropriate message if it wants to stop the+# commit. The hook is allowed to edit the commit message file.+#+# To enable this hook, rename this file to "commit-msg".++# Uncomment the below to add a Signed-off-by line to the message.+# Doing this in a hook is a bad idea in general, but the prepare-commit-msg+# hook is more suited to it.+#+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"++# This example catches duplicate Signed-off-by lines.++test "" = "$(grep '^Signed-off-by: ' "$1" |+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {+ echo >&2 Duplicate Signed-off-by lines.+ exit 1+}
@@ -0,0 +1,8 @@+#!/bin/sh+#+# An example hook script to prepare a packed repository for use over+# dumb transports.+#+# To enable this hook, rename this file to "post-update".++exec git update-server-info
@@ -0,0 +1,14 @@+#!/bin/sh+#+# An example hook script to verify what is about to be committed+# by applypatch from an e-mail message.+#+# The hook should exit with non-zero status after issuing an+# appropriate message if it wants to stop the commit.+#+# To enable this hook, rename this file to "pre-applypatch".++. git-sh-setup+test -x "$GIT_DIR/hooks/pre-commit" &&+ exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}+:
@@ -0,0 +1,49 @@+#!/bin/sh+#+# An example hook script to verify what is about to be committed.+# Called by "git commit" with no arguments. The hook should+# exit with non-zero status after issuing an appropriate message if+# it wants to stop the commit.+#+# To enable this hook, rename this file to "pre-commit".++if git rev-parse --verify HEAD >/dev/null 2>&1+then+ against=HEAD+else+ # Initial commit: diff against an empty tree object+ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904+fi++# If you want to allow non-ASCII filenames set this variable to true.+allownonascii=$(git config --bool hooks.allownonascii)++# Redirect output to stderr.+exec 1>&2++# Cross platform projects tend to avoid non-ASCII filenames; prevent+# them from being added to the repository. We exploit the fact that the+# printable range starts at the space character and ends with tilde.+if [ "$allownonascii" != "true" ] &&+ # Note that the use of brackets around a tr range is ok here, (it's+ # even required, for portability to Solaris 10's /usr/bin/tr), since+ # the square bracket bytes happen to fall in the designated range.+ test $(git diff --cached --name-only --diff-filter=A -z $against |+ LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0+then+ cat <<\EOF+Error: Attempt to add a non-ASCII file name.++This can cause problems if you want to work with people on other platforms.++To be portable it is advisable to rename the file.++If you know what you are doing you can disable this check using:++ git config hooks.allownonascii true+EOF+ exit 1+fi++# If there are whitespace errors, print the offending file names and fail.+exec git diff-index --check --cached $against --
@@ -0,0 +1,54 @@+#!/bin/sh++# An example hook script to verify what is about to be pushed. Called by "git+# push" after it has checked the remote status, but before anything has been+# pushed. If this script exits with a non-zero status nothing will be pushed.+#+# This hook is called with the following parameters:+#+# $1 -- Name of the remote to which the push is being done+# $2 -- URL to which the push is being done+#+# If pushing without using a named remote those arguments will be equal.+#+# Information about the commits which are being pushed is supplied as lines to+# the standard input in the form:+#+# <local ref> <local sha1> <remote ref> <remote sha1>+#+# This sample shows how to prevent push of commits where the log message starts+# with "WIP" (work in progress).++remote="$1"+url="$2"++z40=0000000000000000000000000000000000000000++IFS=' '+while read local_ref local_sha remote_ref remote_sha+do+ if [ "$local_sha" = $z40 ]+ then+ # Handle delete+ :+ else+ if [ "$remote_sha" = $z40 ]+ then+ # New branch, examine all commits+ range="$local_sha"+ else+ # Update to existing branch, examine new commits+ range="$remote_sha..$local_sha"+ fi++ # Check for WIP commit+ commit=`git rev-list -n 1 --grep '^WIP' "$range"`+ if [ -n "$commit" ]+ then+ echo "Found WIP commit in $local_ref, not pushing"+ exit 1+ fi+ fi+done++exit 0
@@ -0,0 +1,169 @@+#!/bin/sh+#+# Copyright (c) 2006, 2008 Junio C Hamano+#+# The "pre-rebase" hook is run just before "git rebase" starts doing+# its job, and can prevent the command from running by exiting with+# non-zero status.+#+# The hook is called with the following parameters:+#+# $1 -- the upstream the series was forked from.+# $2 -- the branch being rebased (or empty when rebasing the current branch).+#+# This sample shows how to prevent topic branches that are already+# merged to 'next' branch from getting rebased, because allowing it+# would result in rebasing already published history.++publish=next+basebranch="$1"+if test "$#" = 2+then+ topic="refs/heads/$2"+else+ topic=`git symbolic-ref HEAD` ||+ exit 0 ;# we do not interrupt rebasing detached HEAD+fi++case "$topic" in+refs/heads/??/*)+ ;;+*)+ exit 0 ;# we do not interrupt others.+ ;;+esac++# Now we are dealing with a topic branch being rebased+# on top of master. Is it OK to rebase it?++# Does the topic really exist?+git show-ref -q "$topic" || {+ echo >&2 "No such branch $topic"+ exit 1+}++# Is topic fully merged to master?+not_in_master=`git rev-list --pretty=oneline ^master "$topic"`+if test -z "$not_in_master"+then+ echo >&2 "$topic is fully merged to master; better remove it."+ exit 1 ;# we could allow it, but there is no point.+fi++# Is topic ever merged to next? If so you should not be rebasing it.+only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`+only_next_2=`git rev-list ^master ${publish} | sort`+if test "$only_next_1" = "$only_next_2"+then+ not_in_topic=`git rev-list "^$topic" master`+ if test -z "$not_in_topic"+ then+ echo >&2 "$topic is already up-to-date with master"+ exit 1 ;# we could allow it, but there is no point.+ else+ exit 0+ fi+else+ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`+ /usr/bin/perl -e '+ my $topic = $ARGV[0];+ my $msg = "* $topic has commits already merged to public branch:\n";+ my (%not_in_next) = map {+ /^([0-9a-f]+) /;+ ($1 => 1);+ } split(/\n/, $ARGV[1]);+ for my $elem (map {+ /^([0-9a-f]+) (.*)$/;+ [$1 => $2];+ } split(/\n/, $ARGV[2])) {+ if (!exists $not_in_next{$elem->[0]}) {+ if ($msg) {+ print STDERR $msg;+ undef $msg;+ }+ print STDERR " $elem->[1]\n";+ }+ }+ ' "$topic" "$not_in_next" "$not_in_master"+ exit 1+fi++exit 0++################################################################++This sample hook safeguards topic branches that have been+published from being rewound.++The workflow assumed here is:++ * Once a topic branch forks from "master", "master" is never+ merged into it again (either directly or indirectly).++ * Once a topic branch is fully cooked and merged into "master",+ it is deleted. If you need to build on top of it to correct+ earlier mistakes, a new topic branch is created by forking at+ the tip of the "master". This is not strictly necessary, but+ it makes it easier to keep your history simple.++ * Whenever you need to test or publish your changes to topic+ branches, merge them into "next" branch.++The script, being an example, hardcodes the publish branch name+to be "next", but it is trivial to make it configurable via+$GIT_DIR/config mechanism.++With this workflow, you would want to know:++(1) ... if a topic branch has ever been merged to "next". Young+ topic branches can have stupid mistakes you would rather+ clean up before publishing, and things that have not been+ merged into other branches can be easily rebased without+ affecting other people. But once it is published, you would+ not want to rewind it.++(2) ... if a topic branch has been fully merged to "master".+ Then you can delete it. More importantly, you should not+ build on top of it -- other people may already want to+ change things related to the topic as patches against your+ "master", so if you need further changes, it is better to+ fork the topic (perhaps with the same name) afresh from the+ tip of "master".++Let's look at this example:++ o---o---o---o---o---o---o---o---o---o "next"+ / / / /+ / a---a---b A / /+ / / / /+ / / c---c---c---c B /+ / / / \ /+ / / / b---b C \ /+ / / / / \ /+ ---o---o---o---o---o---o---o---o---o---o---o "master"+++A, B and C are topic branches.++ * A has one fix since it was merged up to "next".++ * B has finished. It has been fully merged up to "master" and "next",+ and is ready to be deleted.++ * C has not merged to "next" at all.++We would want to allow C to be rebased, refuse A, and encourage+B to be deleted.++To compute (1):++ git rev-list ^master ^topic next+ git rev-list ^master next++ if these match, topic has not merged in next at all.++To compute (2):++ git rev-list master..topic++ if this is empty, it is fully merged to "master".
@@ -0,0 +1,36 @@+#!/bin/sh+#+# An example hook script to prepare the commit log message.+# Called by "git commit" with the name of the file that has the+# commit message, followed by the description of the commit+# message's source. The hook's purpose is to edit the commit+# message file. If the hook fails with a non-zero status,+# the commit is aborted.+#+# To enable this hook, rename this file to "prepare-commit-msg".++# This hook includes three examples. The first comments out the+# "Conflicts:" part of a merge commit.+#+# The second includes the output of "git diff --name-status -r"+# into the message, just before the "git status" output. It is+# commented because it doesn't cope with --amend or with squashed+# commits.+#+# The third example adds a Signed-off-by line to the message, that can+# still be edited. This is rarely a good idea.++case "$2,$3" in+ merge,)+ /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;++# ,|template,)+# /usr/bin/perl -i.bak -pe '+# print "\n" . `git diff --cached --name-status -r`+# if /^#/ && $first++ == 0' "$1" ;;++ *) ;;+esac++# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
@@ -0,0 +1,128 @@+#!/bin/sh+#+# An example hook script to blocks unannotated tags from entering.+# Called by "git receive-pack" with arguments: refname sha1-old sha1-new+#+# To enable this hook, rename this file to "update".+#+# Config+# ------+# hooks.allowunannotated+# This boolean sets whether unannotated tags will be allowed into the+# repository. By default they won't be.+# hooks.allowdeletetag+# This boolean sets whether deleting tags will be allowed in the+# repository. By default they won't be.+# hooks.allowmodifytag+# This boolean sets whether a tag may be modified after creation. By default+# it won't be.+# hooks.allowdeletebranch+# This boolean sets whether deleting branches will be allowed in the+# repository. By default they won't be.+# hooks.denycreatebranch+# This boolean sets whether remotely creating branches will be denied+# in the repository. By default this is allowed.+#++# --- Command line+refname="$1"+oldrev="$2"+newrev="$3"++# --- Safety check+if [ -z "$GIT_DIR" ]; then+ echo "Don't run this script from the command line." >&2+ echo " (if you want, you could supply GIT_DIR then run" >&2+ echo " $0 <ref> <oldrev> <newrev>)" >&2+ exit 1+fi++if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then+ echo "usage: $0 <ref> <oldrev> <newrev>" >&2+ exit 1+fi++# --- Config+allowunannotated=$(git config --bool hooks.allowunannotated)+allowdeletebranch=$(git config --bool hooks.allowdeletebranch)+denycreatebranch=$(git config --bool hooks.denycreatebranch)+allowdeletetag=$(git config --bool hooks.allowdeletetag)+allowmodifytag=$(git config --bool hooks.allowmodifytag)++# check for no description+projectdesc=$(sed -e '1q' "$GIT_DIR/description")+case "$projectdesc" in+"Unnamed repository"* | "")+ echo "*** Project description file hasn't been set" >&2+ exit 1+ ;;+esac++# --- Check types+# if $newrev is 0000...0000, it's a commit to delete a ref.+zero="0000000000000000000000000000000000000000"+if [ "$newrev" = "$zero" ]; then+ newrev_type=delete+else+ newrev_type=$(git cat-file -t $newrev)+fi++case "$refname","$newrev_type" in+ refs/tags/*,commit)+ # un-annotated tag+ short_refname=${refname##refs/tags/}+ if [ "$allowunannotated" != "true" ]; then+ echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2+ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2+ exit 1+ fi+ ;;+ refs/tags/*,delete)+ # delete tag+ if [ "$allowdeletetag" != "true" ]; then+ echo "*** Deleting a tag is not allowed in this repository" >&2+ exit 1+ fi+ ;;+ refs/tags/*,tag)+ # annotated tag+ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1+ then+ echo "*** Tag '$refname' already exists." >&2+ echo "*** Modifying a tag is not allowed in this repository." >&2+ exit 1+ fi+ ;;+ refs/heads/*,commit)+ # branch+ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then+ echo "*** Creating a branch is not allowed in this repository" >&2+ exit 1+ fi+ ;;+ refs/heads/*,delete)+ # delete branch+ if [ "$allowdeletebranch" != "true" ]; then+ echo "*** Deleting a branch is not allowed in this repository" >&2+ exit 1+ fi+ ;;+ refs/remotes/*,commit)+ # tracking branch+ ;;+ refs/remotes/*,delete)+ # delete tracking branch+ if [ "$allowdeletebranch" != "true" ]; then+ echo "*** Deleting a tracking branch is not allowed in this repository" >&2+ exit 1+ fi+ ;;+ *)+ # Anything else (is there anything else?)+ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2+ exit 1+ ;;+esac++# --- Finished+exit 0
binary file changed (absent → 1576 bytes)
@@ -0,0 +1,6 @@+# git ls-files --others --exclude-from=.git/info/exclude+# Lines that start with '#' are comments.+# For a project mostly in C, the following would be a good set of+# exclude patterns (uncomment them if you want to use them):+# *.[oa]+# *~
@@ -0,0 +1,3 @@+0000000000000000000000000000000000000000 6a35d077429c47159fd674466174acd97eb207b8 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424579505 +0800 clone: from https://github.com/HaskellZhangSong/TemplateHaskellUtils.git+6a35d077429c47159fd674466174acd97eb207b8 1d5ed8a5bd5a630d659dac826f1d251b60317469 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424584157 +0800 commit: updated some basic functions+1d5ed8a5bd5a630d659dac826f1d251b60317469 d1247d5c2308a73ca68c144ce67b060d3023b385 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424584417 +0800 commit: update readme
@@ -0,0 +1,3 @@+0000000000000000000000000000000000000000 6a35d077429c47159fd674466174acd97eb207b8 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424579505 +0800 clone: from https://github.com/HaskellZhangSong/TemplateHaskellUtils.git+6a35d077429c47159fd674466174acd97eb207b8 1d5ed8a5bd5a630d659dac826f1d251b60317469 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424584157 +0800 commit: updated some basic functions+1d5ed8a5bd5a630d659dac826f1d251b60317469 d1247d5c2308a73ca68c144ce67b060d3023b385 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424584417 +0800 commit: update readme
@@ -0,0 +1,1 @@+0000000000000000000000000000000000000000 6a35d077429c47159fd674466174acd97eb207b8 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424579505 +0800 clone: from https://github.com/HaskellZhangSong/TemplateHaskellUtils.git
@@ -0,0 +1,2 @@+6a35d077429c47159fd674466174acd97eb207b8 1d5ed8a5bd5a630d659dac826f1d251b60317469 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424584206 +0800 update by push+1d5ed8a5bd5a630d659dac826f1d251b60317469 d1247d5c2308a73ca68c144ce67b060d3023b385 HaskellZhangSong <Haskell.Zhang.Song@hotmail.com> 1424584455 +0800 update by push
binary file changed (absent → 51 bytes)
binary file changed (absent → 157 bytes)
binary file changed (absent → 83 bytes)
binary file changed (absent → 123 bytes)
binary file changed (absent → 182 bytes)
binary file changed (absent → 45 bytes)
binary file changed (absent → 60 bytes)
binary file changed (absent → 9517 bytes)
binary file changed (absent → 60 bytes)
binary file changed (absent → 12658 bytes)
@@ -0,0 +1,2 @@+xα agâî&¸ÒÄGÝÜn)¤Åŧ£àúäÏq%çXAIÜÕÕ{° !=^9;ÚNi=ÜI´©î5δÍ>¥[ eºeÃOøëC|kv+¥f» µÒ]?H4°VÖ´]¨þ/1vYbà[eoï¸G
binary file changed (absent → 174 bytes)
binary file changed (absent → 112 bytes)
binary file changed (absent → 3836 bytes)
@@ -0,0 +1,3 @@+x½MoÚ0wæW¼bRUªÆ%0ÓÚÒF¤õ4 à!¤ÒúãûÚñXñ©§HñÄOÞ/ÏE>(Ð/w7ðÀ$ÂÓãxú ¦Ùj¯+Á¯ìÈ7¬X¥L,ùïXÁ0?Àw6gnîZ-|dé-9ÌÙ=PµöuÁ_W[/O¿ÇÉd¦Ö¡möqùçx2«"×ö'ßÑ[}n7«m¾ëÀõïYêÀ@Þß¡vs4ÂWW4_¦ð±¸|¬üÒÃÂNM¬à)P=ÈØ~Í "2DÉÐ&ùÚ¶7qOùȦ5å)Úå<Àÿt %ݪë4I~C¦hk¦®xByºum»î6Ýèe+ÝhÃ[V»¥Rfû: ÷gí4írøiÎSкu³SúeæÒͰ)ÃACñ¾¢¸LS,Ⱦ#zH¨DÄ!§_QömfõÒE³~C¬»e1¸Ä2ÓK,ó³öÓ6þÇ̲: bÍ5ÅäzyYn =£÷Y[,òtmö!4ê sÄÑ~ÍZs¹ÞcUý¼=Îj43&åAµ!ém1Ò-)§$¾ÌSѳÅXÄiiN^¥Åd2 BÒÏëI,DE¸Ô¤o¶Ö6nÇr8¨cªÃûz<dû4ÂùàvÓÌe=yîS s¿í0A£ÚY¦6¹ñ?hJehºh@OO¿ÅY"y¢éß±+Õ î:À¬
binary file changed (absent → 61 bytes)
binary file changed (absent → 7632 bytes)
binary file changed (absent → 54 bytes)
binary file changed (absent → 227 bytes)
binary file changed (absent → 50 bytes)
binary file changed (absent → 500 bytes)
binary file changed (absent → 78 bytes)
binary file changed (absent → 227 bytes)
binary file changed (absent → 49 bytes)
binary file changed (absent → 44 bytes)
binary file changed (absent → 552 bytes)
@@ -0,0 +1,1 @@+x+)JMU07g040031Q(N-)-ÐË(fÐg¹÷ô¿õL§B_w·V½0¡EMYjQqf~CÌîY¾2³Lïl·¹-ë·ñÃ,'>7"v
@@ -0,0 +1,1 @@+xR;OÃ0XXìØÎÃI'¤"¡[˼ØNGuJq~=nkwHS^ì»ó÷¸³ îÄSñ [n¿3e³ÕÜ@ñ~Sj SkW¼ö·G Qú>O1DºµJ²³>äeø©x[Áe×V¯ª3 ¯5]ãØozÿRGÃ!UÆlûYTµQØÝÝmG¬\®ðaìG<ãðva¼*ýü~ïл^åpÑ#^Þfì=3ëM9aEÝ&ZÎÅßùòǧ·{&¾ry x_RûP¥QL( !(JÎiò,ÅRHÊNíÿADH´Ò8CaHpF8 ÀÑ7çÒ~\üW.:Éi4;±·ûøÓY¨xaqçÀÎÿAðÝ~ÏË
binary file changed (absent → 9252 bytes)
binary file changed (absent → 470 bytes)
@@ -0,0 +1,2 @@+xν0@aç>ÅÝMH[úGb£»Û¥÷FJI-ï/ÁõNNÌ)=*h'µ0C`}Û²¦ Bfè;F#-3:$bi¼+^*(²LmO]+ÉÙ0íEÚªÞÉVyã:[r+¾<Ï÷ ñN?i¾Ô|ì2åð171§3(£ Æ(G¤»îËÿÛJX+#%oó¥U4
binary file changed (absent → 1372 bytes)
@@ -0,0 +1,1 @@+xuÎÁJÄ0`¯æ)~ð¢ØvE="W¡Ê8 b¶2ÝoR{pA!3ÿqnnïÎ.ÐÑ!«ôlåBxÕ1ÉBCòäuäI0pÂÌÊøL£taÍÁó#| ÐÑÄ´-¾ðcaFQðP~c"¢¿¼¾j°i°ÝW¹tØ`kPÏy¹6ƧcÄn¾¼/{´÷¨ 9uTæO¢){åÔÔæ¢· \iÞÂÁà<uÞá_ªÕÿG)K¸ºÉ/ËçæýSû¾önæ
binary file changed (absent → 652 bytes)
binary file changed (absent → 53 bytes)
@@ -0,0 +1,2 @@+# pack-refs with: peeled fully-peeled +6a35d077429c47159fd674466174acd97eb207b8 refs/remotes/origin/master
@@ -0,0 +1,1 @@+d1247d5c2308a73ca68c144ce67b060d3023b385
@@ -0,0 +1,1 @@+ref: refs/remotes/origin/master
@@ -0,0 +1,1 @@+d1247d5c2308a73ca68c144ce67b060d3023b385
@@ -0,0 +1,20 @@+Copyright (c) 2015 songzh + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,12 @@+# TemplateHaskellUtils+useful functions for you to write template Haskell code++some examples+-- | Apply a list of expression [(+), 1, 2] to (+) 1 2+ appExp :: [ExpQ] -> ExpQ++-- | Apply a type constructor, convert [a, b, c] to a b c+ appConT :: [TypeQ] -> TypeQ++-- | convert [a, b, c] to a -> b -> c+ curryType :: [TypeQ] -> TypeQ
@@ -0,0 +1,2 @@+import Distribution.Simple +main = defaultMain
@@ -0,0 +1,77 @@+module Language.Haskell.TH.Utils( + appExp, + appConT, + curryType, + genBT, + genPE, + appKinds, + curryKind, + getTypeNames, + getTVBName , + getCompositeType +) +where + +import Language.Haskell.TH +import Language.Haskell.TH.Lib +import Data.List (foldl1,foldr1) + +-- | Apply a list of expression [(+), 1, 2] to (+) 1 2 +appExp :: [ExpQ] -> ExpQ +appExp = appsE + +-- | Apply a type constructor, convert [a, b, c] to a b c +appConT :: [TypeQ] -> TypeQ +appConT = foldl1 appT + +-- | convert [a, b, c] to a -> b -> c +curryType :: [TypeQ] -> TypeQ +curryType = foldr1 (\t1 -> appT (appT arrowT t1)) + +-- | Bind and Type +genBT :: String -> Int -> Q ([TyVarBndr], [TypeQ]) +genBT name n = do + let ns = [name++ (show i) | i <- [1..n]] + tvb <- sequence $ map (return.plainTV.mkName) ns + typ <- sequence $ map (return.varT.mkName) ns + return (tvb,typ) + +-- | Pattern and expression +genPE :: String -> Int -> Q ([PatQ],[ExpQ]) +genPE name n = do + let ns = [name++ (show i) | i <- [1..n]] + pat <- sequence $ map (return.varP.mkName) ns + exp <- sequence $ map (return.varE.mkName) ns + return (pat,exp) + +-- | Apply a list of kinds +appKinds :: [Kind] -> Kind +appKinds = foldr1 AppT + +-- | [k1,k2,k3] to k1 -> k2 -> k3 +curryKind :: [Kind] -> Kind +curryKind = foldr1 (\t1 -> appK (appK arrowK t1)) + +-- | get type Names recursively +getTypeNames :: Type -> [Name] +getTypeNames (ForallT tvbs cxt t) = getTypeNames t +getTypeNames (ConT n) = [n] +getTypeNames (AppT t1 t2) = getTypeNames t1 ++ getTypeNames t2 +getTypeNames _ = [] + +-- | get type var bind name +getTVBName :: TyVarBndr -> Name +getTVBName (PlainTV name ) = name +getTVBName (KindedTV name _) = name + + +third (a,b,c) = c + +-- | get all names recursively from a constructor +getCompositeType :: Con -> [Name] +getCompositeType (NormalC n sts) = concatMap getTypeNames (map snd sts) +getCompositeType (RecC n vars) = concatMap getTypeNames (map third vars) +getCompositeType (InfixC st1 n st2) = concatMap getTypeNames [snd st1 , snd st2] + --v this could be a problem since it will lose info for context and type variables +getCompositeType (ForallC tvbs cxt con) = getCompositeType con +
@@ -0,0 +1,26 @@+-- Initial template-haskell-util.cabal generated by cabal init. For +-- further documentation, see http://haskell.org/cabal/users-guide/ + +name: template-haskell-util +version: 0.1.0.0 +synopsis: Some utilities for template Haskell. +description: Some functions that might be useful when you use template haskell. +homepage: https://github.com/HaskellZhangSong/TemplateHaskellUtils +license: MIT +license-file: LICENSE +author: songzh +maintainer: Haskell.Zhang.Song@hotmail.com +-- copyright: +category: Language +build-type: Simple +extra-source-files: README.md +cabal-version: >=1.10 + +library + exposed-modules: + Language.Haskell.TH.Utils + -- other-modules: + -- other-extensions: + build-depends: base ==4.* , template-haskell >= 2.9 + hs-source-dirs: src + default-language: Haskell2010