diff options
| -rw-r--r-- | client/src/Thermoprint/Client.hs | 28 | ||||
| -rw-r--r-- | client/thermoprint-client.cabal | 1 | ||||
| -rw-r--r-- | client/thermoprint-client.nix | 9 | ||||
| -rw-r--r-- | default.nix | 43 |
4 files changed, 48 insertions, 33 deletions
diff --git a/client/src/Thermoprint/Client.hs b/client/src/Thermoprint/Client.hs index 46f6073..8c4d99d 100644 --- a/client/src/Thermoprint/Client.hs +++ b/client/src/Thermoprint/Client.hs | |||
| @@ -5,7 +5,10 @@ | |||
| 5 | {-# LANGUAGE RecordWildCards #-} | 5 | {-# LANGUAGE RecordWildCards #-} |
| 6 | {-# LANGUAGE FlexibleContexts #-} | 6 | {-# LANGUAGE FlexibleContexts #-} |
| 7 | {-# LANGUAGE FlexibleInstances #-} | 7 | {-# LANGUAGE FlexibleInstances #-} |
| 8 | {-# LANGUAGE MultiParamTypeClasses #-} | ||
| 8 | {-# LANGUAGE RankNTypes #-} | 9 | {-# LANGUAGE RankNTypes #-} |
| 10 | {-# LANGUAGE FunctionalDependencies #-} | ||
| 11 | {-# LANGUAGE UndecidableInstances #-} | ||
| 9 | 12 | ||
| 10 | -- | A client library for 'Thermoprint.API' | 13 | -- | A client library for 'Thermoprint.API' |
| 11 | module Thermoprint.Client | 14 | module Thermoprint.Client |
| @@ -16,7 +19,7 @@ module Thermoprint.Client | |||
| 16 | , module Thermoprint.API | 19 | , module Thermoprint.API |
| 17 | , module Servant.Common.BaseUrl | 20 | , module Servant.Common.BaseUrl |
| 18 | , module Control.Monad.Except | 21 | , module Control.Monad.Except |
| 19 | , module Servant.Utils.Enter | 22 | , module Control.Natural |
| 20 | ) where | 23 | ) where |
| 21 | 24 | ||
| 22 | import Thermoprint.API | 25 | import Thermoprint.API |
| @@ -30,7 +33,8 @@ import Servant.Common.BaseUrl | |||
| 30 | import Servant.Common.Req | 33 | import Servant.Common.Req |
| 31 | import Network.HTTP.Client (Manager, ManagerSettings, newManager, defaultManagerSettings) | 34 | import Network.HTTP.Client (Manager, ManagerSettings, newManager, defaultManagerSettings) |
| 32 | import Servant.API | 35 | import Servant.API |
| 33 | import Servant.Utils.Enter | 36 | -- import Servant.Utils.Enter |
| 37 | import Control.Natural ((:~>)(..)) | ||
| 34 | import Control.Monad.Except (ExceptT(..), runExceptT) | 38 | import Control.Monad.Except (ExceptT(..), runExceptT) |
| 35 | 39 | ||
| 36 | import Control.Monad.Reader (ReaderT, runReaderT, ask) | 40 | import Control.Monad.Reader (ReaderT, runReaderT, ask) |
| @@ -42,6 +46,20 @@ import Control.Monad | |||
| 42 | import Control.Category | 46 | import Control.Category |
| 43 | import Prelude hiding (id, (.)) | 47 | import Prelude hiding (id, (.)) |
| 44 | 48 | ||
| 49 | |||
| 50 | class Enter typ mod ret | typ mod -> ret, typ ret -> mod, mod ret -> typ where | ||
| 51 | enter :: mod -> typ -> ret | ||
| 52 | |||
| 53 | instance Enter (m a) (m :~> n) (n a) where | ||
| 54 | enter (NT f) = f | ||
| 55 | |||
| 56 | instance (Enter typ1 mod1 ret1, Enter typ2 mod2 ret2, mod1 ~ mod2) => Enter (typ1 :<|> typ2) mod1 (ret1 :<|> ret2) where | ||
| 57 | enter mod (a :<|> b) = enter mod a :<|> enter mod b | ||
| 58 | |||
| 59 | instance Enter typ mod ret => Enter (r -> typ) mod (r -> ret) where | ||
| 60 | enter mod = (enter mod .) | ||
| 61 | |||
| 62 | |||
| 45 | -- | All 'ThermoprintAPI'-functions as a record | 63 | -- | All 'ThermoprintAPI'-functions as a record |
| 46 | -- | 64 | -- |
| 47 | -- Use like this: | 65 | -- Use like this: |
| @@ -105,10 +123,10 @@ mkClientS n = Client{..} | |||
| 105 | = enter n $ client thermoprintAPI | 123 | = enter n $ client thermoprintAPI |
| 106 | 124 | ||
| 107 | mkClient :: (MonadThrow m, MonadIO m) => ManagerSettings -> BaseUrl -> Client m | 125 | mkClient :: (MonadThrow m, MonadIO m) => ManagerSettings -> BaseUrl -> Client m |
| 108 | mkClient mSettings url = mkClientS $ Nat clientNat | 126 | mkClient mSettings url = mkClientS clientNat |
| 109 | where | 127 | where |
| 110 | clientNat :: forall m a. (MonadThrow m, MonadIO m) => ClientM a -> m a | 128 | clientNat :: forall m. (MonadThrow m, MonadIO m) => ClientM :~> m |
| 111 | clientNat cAct = do | 129 | clientNat = NT $ \cAct -> do |
| 112 | mgr <- liftIO $ newManager mSettings | 130 | mgr <- liftIO $ newManager mSettings |
| 113 | either throwM return =<< liftIO (runClientM cAct $ ClientEnv mgr url) | 131 | either throwM return =<< liftIO (runClientM cAct $ ClientEnv mgr url) |
| 114 | 132 | ||
diff --git a/client/thermoprint-client.cabal b/client/thermoprint-client.cabal index 1306542..523b755 100644 --- a/client/thermoprint-client.cabal +++ b/client/thermoprint-client.cabal | |||
| @@ -32,6 +32,7 @@ library | |||
| 32 | , transformers >=0.4.2 && <1 | 32 | , transformers >=0.4.2 && <1 |
| 33 | , http-client >=0.4.28 && <1 | 33 | , http-client >=0.4.28 && <1 |
| 34 | , mtl >=2.2.1 && <3 | 34 | , mtl >=2.2.1 && <3 |
| 35 | , natural-transformation >=0.4 && <1 | ||
| 35 | hs-source-dirs: src | 36 | hs-source-dirs: src |
| 36 | default-language: Haskell2010 | 37 | default-language: Haskell2010 |
| 37 | ghc-options: -Wall | 38 | ghc-options: -Wall |
diff --git a/client/thermoprint-client.nix b/client/thermoprint-client.nix index 7f83630..0046a0f 100644 --- a/client/thermoprint-client.nix +++ b/client/thermoprint-client.nix | |||
| @@ -1,14 +1,15 @@ | |||
| 1 | { mkDerivation, base, containers, either, exceptions, http-client | 1 | { mkDerivation, base, containers, either, exceptions, http-client |
| 2 | , mtl, servant, servant-client, servant-server, stdenv | 2 | , mtl, natural-transformation, servant, servant-client |
| 3 | , thermoprint-spec, time, transformers | 3 | , servant-server, stdenv, thermoprint-spec, time, transformers |
| 4 | }: | 4 | }: |
| 5 | mkDerivation { | 5 | mkDerivation { |
| 6 | pname = "thermoprint-client"; | 6 | pname = "thermoprint-client"; |
| 7 | version = "2.0.0"; | 7 | version = "2.0.0"; |
| 8 | src = ./.; | 8 | src = ./.; |
| 9 | libraryHaskellDepends = [ | 9 | libraryHaskellDepends = [ |
| 10 | base containers either exceptions http-client mtl servant | 10 | base containers either exceptions http-client mtl |
| 11 | servant-client servant-server thermoprint-spec time transformers | 11 | natural-transformation servant servant-client servant-server |
| 12 | thermoprint-spec time transformers | ||
| 12 | ]; | 13 | ]; |
| 13 | homepage = "http://dirty-haskell.org/tags/thermoprint.html"; | 14 | homepage = "http://dirty-haskell.org/tags/thermoprint.html"; |
| 14 | description = "Client for thermoprint-spec"; | 15 | description = "Client for thermoprint-spec"; |
diff --git a/default.nix b/default.nix index 4e65886..2b84d30 100644 --- a/default.nix +++ b/default.nix | |||
| @@ -1,10 +1,12 @@ | |||
| 1 | { pkgs ? (import <nixpkgs> {}) | 1 | args@{ |
| 2 | , compilerName ? "ghc802" | 2 | compilerName ? "ghc802" |
| 3 | , extraPackages ? (p: []) | 3 | , extraPackages ? (p: []) |
| 4 | , ... | ||
| 4 | }: | 5 | }: |
| 5 | 6 | ||
| 6 | rec { | 7 | let |
| 7 | haskellPackages = pkgs.haskell.packages."${compilerName}".override { | 8 | defaultPackages = import <nixpkgs> {}; |
| 9 | haskellPackages = defaultPackages.haskell.packages."${compilerName}".override { | ||
| 8 | overrides = self: super: with super; { | 10 | overrides = self: super: with super; { |
| 9 | # threepenny-gui = pkgs.haskell.lib.appendPatch threepenny-gui ./threepenny.patch; | 11 | # threepenny-gui = pkgs.haskell.lib.appendPatch threepenny-gui ./threepenny.patch; |
| 10 | encoding = pkgs.haskell.lib.doJailbreak encoding; | 12 | encoding = pkgs.haskell.lib.doJailbreak encoding; |
| @@ -12,25 +14,18 @@ rec { | |||
| 12 | extended-reals = pkgs.haskell.lib.doJailbreak extended-reals; | 14 | extended-reals = pkgs.haskell.lib.doJailbreak extended-reals; |
| 13 | }; | 15 | }; |
| 14 | }; | 16 | }; |
| 15 | thermoprint-spec = haskellPackages.callPackage ./spec/thermoprint-spec.nix {}; | 17 | pkgs = defaultPackages // haskellPackages // args; |
| 16 | thermoprint-bbcode = haskellPackages.callPackage ./tp-bbcode/thermoprint-bbcode.nix { | 18 | callPackage = pkgs.lib.callPackageWith (pkgs // self); |
| 17 | inherit bbcode thermoprint-spec; | 19 | self = { |
| 18 | }; | 20 | thermoprint-spec = callPackage ./spec/thermoprint-spec.nix {}; |
| 19 | thermoprint-client = haskellPackages.callPackage ./client/thermoprint-client.nix { | 21 | thermoprint-bbcode = callPackage ./tp-bbcode/thermoprint-bbcode.nix {}; |
| 20 | inherit thermoprint-spec; | 22 | thermoprint-client = callPackage ./client/thermoprint-client.nix {}; |
| 21 | }; | 23 | thermoprint-server = callPackage ./server/wrapped.nix { |
| 22 | thermoprint-server = pkgs.callPackage ./server/wrapped.nix { | 24 | inherit extraPackages; |
| 23 | inherit (haskellPackages) ghcWithPackages; | 25 | thermoprint-server = callPackage ./server/thermoprint-server.nix {}; |
| 24 | inherit extraPackages; | ||
| 25 | thermoprint-server = haskellPackages.callPackage ./server/thermoprint-server.nix { | ||
| 26 | inherit thermoprint-spec thermoprint-client; | ||
| 27 | }; | 26 | }; |
| 27 | thermoprint-webgui = callPackage ./webgui/thermoprint-webgui.nix {}; | ||
| 28 | tprint = callPackage ./tprint/tprint.nix {}; | ||
| 29 | bbcode = callPackage ./bbcode/bbcode.nix {}; | ||
| 28 | }; | 30 | }; |
| 29 | thermoprint-webgui = haskellPackages.callPackage ./webgui/thermoprint-webgui.nix { | 31 | in self |
| 30 | inherit thermoprint-bbcode thermoprint-client; | ||
| 31 | }; | ||
| 32 | tprint = haskellPackages.callPackage ./tprint/tprint.nix { | ||
| 33 | inherit thermoprint-bbcode thermoprint-client; | ||
| 34 | }; | ||
| 35 | bbcode = haskellPackages.callPackage ./bbcode/bbcode.nix {}; | ||
| 36 | } | ||
