Ur/Web Examples
Check-in [34f12621b3]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:finally commit experimental JSON RPC client, written in Haskell, called by Ur/Web via the C FFI, written at some point from 2015-02-15 15:37:39 to 2015-08-11 22:08:20 (via timestamps). It definitely worked the last time that I tried running it, albeit it was highly experimental...
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1:34f12621b35054d7d4961cc941480770781377d3
User & Date: beyert 2016-08-17 04:47:15
Context
2016-08-17
04:50
add composable signals libary, providing various lift functions for signals, similar to liftA in Haskell check-in: e1c70eddd2 user: beyert tags: trunk
04:47
finally commit experimental JSON RPC client, written in Haskell, called by Ur/Web via the C FFI, written at some point from 2015-02-15 15:37:39 to 2015-08-11 22:08:20 (via timestamps). It definitely worked the last time that I tried running it, albeit it was highly experimental... check-in: 34f12621b3 user: beyert tags: trunk
04:28
- this change has remained uncommitted since 2015-05-18 00:07:20, not sure if it is useful for sensible, but commit anyway... check-in: 06fb318b2b user: beyert tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to .fossil-settings/ignore-glob.

5
6
7
8
9
10
11





iota/*.exe
iota/*.o
pseudoRandom/.make-targets
pseudoRandom/*.exe
pseudoRandom/*.o
pseudoRandomIota/.make-targets
pseudoRandomIota/*.exe












>
>
>
>
>
5
6
7
8
9
10
11
12
13
14
15
16
iota/*.exe
iota/*.o
pseudoRandom/.make-targets
pseudoRandom/*.exe
pseudoRandom/*.o
pseudoRandomIota/.make-targets
pseudoRandomIota/*.exe
jsonRpcUI/.make-targets
jsonRpcUI/*.o
jsonRpcUI/*.so
jsonRpcUI/*.exe
jsonRpcUI/work

Added jsonRpcUI/COPYRIGHT.



















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Copyright (c) 2015, 2016 Timothy Beyer

Licensed under MIT License

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.

-------------------------------------------------------------------------------

Copyright (c) 2014 Alex Petrov

Licensed under MIT License

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.

-------------------------------------------------------------------------------

The following license covers this documentation, and the source code, except
where otherwise indicated.

Copyright 2012, Michael Snoyman. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Added jsonRpcUI/JsonClient.hsc.















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{-# LANGUAGE CPP #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE OverloadedStrings #-}

module JsonClient where

import           Control.Monad.IO.Class  (liftIO)
import           Data.Aeson              (Value (Object, String))
import           Data.Aeson              (encode, object, (.=))
import           Data.Aeson.Parser       (json)
import           Data.Conduit            (($$+-))
import           Data.Conduit.Attoparsec (sinkParser)
import           Network.HTTP.Conduit    (RequestBody (RequestBodyLBS),
                                          Response (..), http, method,
                                          parseUrl, requestBody, withManager,
                                          responseBody)

foreign export ccall "jsonRPC" jsonRPC :: IO ()

jsonRPC :: IO ()
jsonRPC = withManager $ \manager -> do
    value <- liftIO makeValue
    -- We need to know the size of the request body, so we convert to a
    -- ByteString
    let valueBS = encode value
    req' <- liftIO $ parseUrl "http://localhost:3000/"
    let req = req' { method = "POST", requestBody = RequestBodyLBS valueBS }
    res <- http req manager
    resValue <- responseBody res $$+- sinkParser json
    liftIO $ handleResponse resValue

-- Application-specific function to make the request value
makeValue :: IO Value
makeValue = return $ object
    [ ("test123" .= ("foo" .= ("bar" :: String))) ]

-- Application-specific function to handle the response from the server
handleResponse :: Value -> IO ()
handleResponse = print

Added jsonRpcUI/JsonRpc-old.c.





















>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
#include "HsFFI.h"
#include "JsonClient_stub.h"

int main(int argc, char *argv[]) {
  /* hs_init(&argc, &argv); */
  HsStart();
  jsonRPC();
  HsEnd();
  return 0;
}

Added jsonRpcUI/Makefile.























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
GHC_VERSION=	7.8.3
RTS_VERSION=	1.0
LOCALBASE=	/usr/local
##LIB=	${LOCALBASE}/lib
GHC_LIB=	${LOCALBASE}/lib/ghc-${GHC_VERSION}
CABAL_LIB=	${LOCALBASE}/lib/cabal/ghc-${GHC_VERSION}
RTS_LIB=	${GHC_LIB}/rts-${RTS_VERSION}
GHC_LIBSUFFIX=	-ghc${GHC_VERSION}
RTS_LIBNAME=	HSrts${GHC_LIBSUFFIX}

JSON_LIBNAME=	JsonRpc
# LDFLAGS+=	-L. -l${JSON_LIBNAME} \
#LDFLAGS+=	-L${RTS_LIB} -l${RTS_LIBNAME} -optl-Wl,-rpath,${GHC_LIB}
CFLAGS+=	-Wno-implicit-function-declaration \
	-I${GHC_LIB}/include \
	-I${LOCALBASE}/include/urweb

BASE_PACKAGES=	\
	-L${GHC_LIB} -L${CABAL_LIB} \
	-L${GHC_LIB}/rts-1.0 -lHSrts${GHC_LIBSUFFIX} \
	-L${GHC_LIB}/ghc-prim-0.3.1.0 -lHSghc-prim-0.3.1.0${GHC_LIBSUFFIX} \
	-L${GHC_LIB}/integer-gmp-0.5.1.0 -lHSinteger-gmp-0.5.1.0${GHC_LIBSUFFIX} \
	-L${GHC_LIB}/base-4.7.0.1 -lHSbase-4.7.0.1${GHC_LIBSUFFIX} \
	-L${GHC_LIB}/array-0.5.0.0 -lHSarray-0.5.0.0${GHC_LIBSUFFIX} \
	-L${GHC_LIB}/deepseq-1.3.0.2 -lHSdeepseq-1.3.0.2${GHC_LIBSUFFIX} \
	-L${GHC_LIB}/bytestring-0.10.4.0 -lHSbytestring-0.10.4.0${GHC_LIBSUFFIX} \
	-L${GHC_LIB}/transformers-0.3.0.0 -lHStransformers-0.3.0.0${GHC_LIBSUFFIX}
CABAL_PACKAGES= \
	-L${CABAL_LIB}/text-1.1.0.0 -lHStext-1.1.0.0${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/aeson-0.7.0.6 -lHSaeson-0.7.0.6${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/monad-control-0.3.3.0 -lHSmonad-control-0.3.3.0${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/resourcet-1.1.2.3 -lHSresourcet-1.1.2.3${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/http-client-0.3.6.1 -lHShttp-client-0.3.6.1${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/conduit-1.1.7 -lHSconduit-1.1.7${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/http-conduit-2.1.4 -lHShttp-conduit-2.1.4${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/conduit-extra-1.1.3 -lHSconduit-extra-1.1.3${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/transformers-base-0.4.2 -lHStransformers-base-0.4.2${GHC_LIBSUFFIX} \
	-L${CABAL_LIB}/exceptions-0.6.1 -lHSexceptions-0.6.1${GHC_LIBSUFFIX} \
	-L${LOCALBASE}/lib -L.

BASE_RPATHS= \
	-optl-Wl,-rpath,${GHC_LIB} \
	-optl-Wl,-rpath,${GHC_LIB}/array-0.5.0.0 \
	-optl-Wl,-rpath,${GHC_LIB}/deepseq-1.3.0.2 \
	-optl-Wl,-rpath,${GHC_LIB}/bytestring-0.10.4.0 \
	-optl-Wl,-rpath,${GHC_LIB}/transformers-0.3.0.0
CABAL_RPATHS= \
	-optl-Wl,-rpath,${CABAL_LIB} \
	-optl-Wl,-rpath,${CABAL_LIB}/text-1.1.0.0 \
	-optl-Wl,-rpath,${CABAL_LIB}/aeson-0.7.0.6 \
	-optl-Wl,-rpath,${CABAL_LIB}/monad-control-0.3.3.0 \
	-optl-Wl,-rpath,${CABAL_LIB}/resourcet-1.1.2.3 \
	-optl-Wl,-rpath,${CABAL_LIB}/http-client-0.3.6.1 \
	-optl-Wl,-rpath,${CABAL_LIB}/conduit-1.1.7 \
	-optl-Wl,-rpath,${CABAL_LIB}/http-conduit-2.1.4 \
	-optl-Wl,-rpath,${CABAL_LIB}/conduit-extra-1.1.3 \
	-optl-Wl,-rpath,${CABAL_LIB}/transformers-base-0.4.2 \
	-optl-Wl,-rpath,${CABAL_LIB}/exceptions-0.6.1

LDFLAGS=	${BASE_PACKAGES} ${CABAL_PACKAGES} ${BASE_RPATHS} ${CABAL_RPATHS}

WRKDIR=	work
FILES=	JsonClient.hsc jsonRpc.c StartEnd.c

all:	jsonRpc

jsonRpc:	libJsonRpc
	@${CC} ${CFLAGS} -O2 -c jsonRpc.c
	@urweb jsonRpc
	@urweb jsonRpcUI
#	@${CC} ${LDFLAGS} -lJsonRpc -o ${@} ${@}.o
#	@cd ${WRKDIR} && ghc -fPIC \
#		JsonClient.o StartEnd.o -L${WRKDIR} ${LDFLAGS} -o lib${JSON_LIBNAME}

#	@${CC} ${LDFLAGS} -o ${@} ${@}.o ${WRKDIR}/StartEnd.o ${WRKDIR}/JsonClient.o
#	@${CC} ${LDFLAGS} -o ${@} ${WRKDIR}/StartEnd.o ${WRKDIR}/JsonClient.o
#	ghc -no-hs-main -threaded ${LDFLAGS} -o ${@} ${WRKDIR}/StartEnd.o ${WRKDIR}/JsonClient.o
#	ghc -threaded ${LDFLAGS} -o ${@} ${WRKDIR}/StartEnd.o ${WRKDIR}/JsonClient.o
#	${CC} ${LDFLAGS} -o ${@} ${WRKDIR}/StartEnd.o ${WRKDIR}/JsonClient.o
#	ghc -threaded ${LDFLAGS} -o ${@} jsonRpc.o

libJsonRpc:	build-JsonClient
	@cp -pR ${WRKDIR}/${@}.so .

${WRKDIR}:
	mkdir -p ${@}
	cp -pR ${FILES} ${@}/

build-JsonClient:	${WRKDIR}
	@cd ${WRKDIR} && ghc -fPIC -c StartEnd.c
	@cd ${WRKDIR} && hsc2hs ${@:S/build-//g}.hsc
	@cd ${WRKDIR} && ghc -dynamic -fPIC -c ${@:S/build-//g}.hs
	@cd ${WRKDIR} && ghc -shared -dynamic -fPIC \
		${@:S/build-//g}.o StartEnd.o -L${WRKDIR} ${LDFLAGS} -o lib${JSON_LIBNAME}.so

clean-jsonRpc:
	rm -f \
		${@:S/clean-//g}.o \
		StartEnd.o \
		lib${JSON_LIBNAME}.so \
		${@:S/clean-//g}.exe \
		${@:S/clean-//g}UI.exe

clean-work:
	rm -rf ${WRKDIR}

clean:	clean-jsonRpc clean-work

Added jsonRpcUI/README.







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
After leaving this experiment uncommitted since early 2015 (developed between 2015-02-15 to 2015-08-11), I have finally decided to commit this in case anyone finds it useful.  It worked the last time that I tried it, albeit it is relatively unfinished.  It is largely built on the shoulders of giants (eg. better Haskell programmers than me :)).

The basic idea is that I wanted a JSON RPC capable client on the server side (written in Haskell, but called from Ur/Web via the C FFI), which in turn communicates with another network service on the server (most likely, running in Haskell).  The benefit of this approach is that it is fully compliant with transactional semantics, which I believe is desirable for highly stateful applications (eg. that modify the file system, run long-running shell commands, read/write files, send/receive emails, and so on).

The Haskell client code (JsonClient.hsc) is derived from the Yesodweb book "JSON Web Service", and is licensed under the MIT license.

Specifics:
source: http://www.yesodweb.com/book/json-web-service
license: MIT (https://raw.githubusercontent.com/yesodweb/yesodweb.com/master/LICENSE)

The FFI portion was inspired by Alex Petrov's Haskell FFI Tutorial, and is licensed under the MIT License.

Specifics:
source: https://github.com/ifesdjeen/haskell-ffi-tutorial
license: https://github.com/ifesdjeen/haskell-ffi-tutorial/master/README.md

See COPYRIGHT for more details on each license.

Timothy Beyer: beyert AT SYMBOL fastmail DOT SYMBOL net

Added jsonRpcUI/StartEnd.c.















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* StartEnd.c
** borrowed from GHC users guide
** https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/win32-dlls.html */

#include <Rts.h>

#define HS_BOOL_TRUE 1

int HsStart(char* name) {
  int argc = 1;
  /* argv must end with NULL */
  char* name_[] = { "ghcDll", NULL };
  /* char* argv[] = { name, NULL }; */

  // Initialize Haskell runtime
  char** argv = name_;
  /* hs_init(&argc, &args); */
  hs_init(&argc, &argv);

  return HS_BOOL_TRUE; }

/* we don't usually want to run this... */
void HsEnd() { hs_exit(); }

Added jsonRpcUI/jsonRpc.c.

































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include "jsonRpc.h"
#include <urweb.h>

uw_Basis_unit uw_JsonRpc_jsonRPC(uw_context ctx, uw_unit u) {
  void *lib = dlopen("libJsonRpc.so", RTLD_LAZY);
  void *sym = dlsym(lib, "jsonRPC");

  /*
    int argc = 1;
    char* argv[] = { "jsonRPC", NULL };
    char** args = argv;
  */

  if ((lib == NULL) || (sym == NULL)) {
    printf("error in shared object: %s\n", dlerror());
    exit(1); }

  /* hs_init(&argc, &argv); */
  HsStart("jsonRPC");

  // printf("testing...");
  jsonRPC();

  /* hs_exit(); */
  /* HsEnd(); */

  dlclose(lib);

  return 0; }

Added jsonRpcUI/jsonRpc.h.







>
>
>
1
2
3
#include <urweb.h>

uw_Basis_unit uw_JsonRpc_jsonRPC(uw_context, uw_unit);

Added jsonRpcUI/jsonRpc.urp.







>
>
>
1
2
3
ffi jsonRpc
include jsonRpc.h
effectful JsonRpc.jsonRPC

Added jsonRpcUI/jsonRpc.urs.





>
>
1
2
val jsonRPC : unit -> transaction unit
(* Performs a JSON RPC request *)

Added jsonRpcUI/jsonRpcUI.ur.



















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
fun rpc_ () : transaction page =
  JsonRpc.jsonRPC ();
  return <xml><body>works</body></xml>

fun main () : transaction page =
  return <xml><body>
    <form><submit value="initiate RPC" action={rpc_}/>
    </form>
  </body></xml>

Added jsonRpcUI/jsonRpcUI.urp.













>
>
>
>
>
>
1
2
3
4
5
6
library jsonRpc
include jsonRpc.h
link jsonRpc.o
linker cc -L. -L/usr/local/lib -L/usr/local/lib/ghc-7.8.3 -L/usr/local/lib/ghc-7.8.3/rts-1.0 -lHSrts-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3/ghc-prim-0.3.1.0 -lHSghc-prim-0.3.1.0-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3/base-4.7.0.1 -lHSbase-4.7.0.1-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3/transformers-0.3.0.0 -lHStransformers-0.3.0.0-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3/integer-gmp-0.5.1.0 -lHSinteger-gmp-0.5.1.0-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3/array-0.5.0.0 -lHSarray-0.5.0.0-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3/deepseq-1.3.0.2 -lHSdeepseq-1.3.0.2-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3/bytestring-0.10.4.0 -lHSbytestring-0.10.4.0-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/aeson-0.7.0.6 -lHSaeson-0.7.0.6-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/monad-control-0.3.3.0 -lHSmonad-control-0.3.3.0-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/resourcet-1.1.2.3 -lHSresourcet-1.1.2.3-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/http-client-0.3.6.1 -lHShttp-client-0.3.6.1-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/conduit-1.1.7 -lHSconduit-1.1.7-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/http-conduit-2.1.4 -lHShttp-conduit-2.1.4-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/conduit-extra-1.1.3 -lHSconduit-extra-1.1.3-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/transformers-base-0.4.2 -lHStransformers-base-0.4.2-ghc7.8.3 -L/usr/local/lib/cabal/ghc-7.8.3/exceptions-0.6.1 -lHSexceptions-0.6.1-ghc7.8.3 -L/usr/local/lib/ghc-7.8.3 -L/usr/local/lib/ghc-7.8.3/rts-1.0 -lJsonRpc -Wl,-rpath,. -Wl,-rpath,/usr/local/lib/ghc-7.8.3 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/rts-1.0 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/ghc-prim-0.3.1.0 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/integer-gmp-0.5.1.0 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/base-4.7.0.1 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/array-0.5.0.0 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/deepseq-1.3.0.2 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/bytestring-0.10.4.0 -Wl,-rpath,/usr/local/lib/ghc-7.8.3/transformers-0.3.0.0 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/aeson-0.7.0.6 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/monad-control-0.3.3.0 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/resourcet-1.1.2.3 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/http-client-0.3.6.1 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/conduit-1.1.7 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/http-conduit-2.1.4 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/conduit-extra-1.1.3 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/transformers-base-0.4.2 -Wl,-rpath,/usr/local/lib/cabal/ghc-7.8.3/exceptions-0.6.1

jsonRpcUI

Added jsonRpcUI/jsonRpcUI.urs.



>
1
val main : unit -> transaction page