diff --git a/.hlint.yaml b/.hlint.yaml
new file mode 100644
--- /dev/null
+++ b/.hlint.yaml
@@ -0,0 +1,6 @@
+# HLint configuration file
+# https://github.com/ndmitchell/hlint
+##########################
+
+- ignore: {name: Use camelCase}
+- ignore: {name: Use fewer imports}
diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+0.10.0.5:
+
+  Support for base from ghc 9.0.
+
 0.10.0.4:
 
   Support for base from ghc 8.10. Switched tested version to 8.8.3
diff --git a/default.nix b/default.nix
new file mode 100644
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,43 @@
+# { compiler ? "ghc8102" }:
+
+# Looks like release-20.03 doesn't have haskell-language-server so stick
+# with nixpkgs-unstable
+{ nixpkgs ? import <nixpkgs> {}, compiler ? "ghc8102" }:
+
+let
+  # sources = import ../nix/sources.nix;
+  # pkgs = import sources.nixpkgs {};
+
+  inherit (nixpkgs) pkgs;
+
+  gitignore = pkgs.nix-gitignore.gitignoreSourcePure [ ./.gitignore ];
+
+  myHaskellPackages = pkgs.haskell.packages.${compiler}.override {
+    overrides = hself: hsuper: {
+      "swish" =
+        hself.callCabal2nix "swish" (gitignore ./.) {};
+    };
+  };
+
+  shell = myHaskellPackages.shellFor {
+    packages = p: [
+      p."swish"
+    ];
+    buildInputs = [
+      pkgs.haskellPackages.cabal-install
+      pkgs.haskellPackages.haskell-language-server
+      pkgs.haskellPackages.hlint
+      pkgs.niv
+    ];
+    withHoogle = true;
+  };
+
+  exe = pkgs.haskell.lib.justStaticExecutables (myHaskellPackages."swish");
+
+in
+{
+  inherit shell;
+  inherit exe;
+  inherit myHaskellPackages;
+  "swish" = myHaskellPackages."swish";
+}
diff --git a/shell.nix b/shell.nix
new file mode 100644
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,2 @@
+{ nixpkgs ? import <nixpkgs> {}, compiler ? "ghc8102" }:
+(import ./default.nix { inherit nixpkgs compiler; }).shell
diff --git a/src/Swish.hs b/src/Swish.hs
--- a/src/Swish.hs
+++ b/src/Swish.hs
@@ -3,7 +3,7 @@
 --------------------------------------------------------------------------------
 -- |
 --  Module      :  Swish
---  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012 Douglas Burke
+--  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -109,7 +109,6 @@
 
 
 import Control.Monad.State (execStateT)
-import Control.Monad (liftM)
 
 import Network.URI (parseURI)
 
@@ -302,12 +301,12 @@
 
 -- | Execute the given set of actions.
 runSwishActions :: [SwishAction] -> IO SwishStatus
-runSwishActions acts = exitcode `liftM` execStateT (swishCommands acts) emptyState
+runSwishActions acts = exitcode `fmap` execStateT (swishCommands acts) emptyState
 
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012 Douglas Burke
+--    2011, 2012, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/Commands.hs b/src/Swish/Commands.hs
--- a/src/Swish/Commands.hs
+++ b/src/Swish/Commands.hs
@@ -6,7 +6,7 @@
 --------------------------------------------------------------------------------
 -- |
 --  Module      :  Commands
---  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2014 Douglas Burke
+--  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2014, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -62,7 +62,7 @@
 
 import Control.Monad.Trans (MonadTrans(..))
 import Control.Monad.State (modify, gets)
-import Control.Monad (liftM, when)
+import Control.Monad (when)
 
 import qualified Data.Set as S
 import qualified Data.Text.Lazy as T
@@ -197,7 +197,7 @@
 calculateBaseURI ::
   Maybe FilePath -- ^ file name
   -> SwishStateIO QName -- ^ base URI
-calculateBaseURI Nothing = fromMaybe defURI `liftM` gets base
+calculateBaseURI Nothing = gets (fromMaybe defURI . base)
 calculateBaseURI (Just fnam) =
   case parseURIReference fnam of
     Just furi -> do
@@ -385,7 +385,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012 Douglas Burke  
+--    2011, 2012, 2014, 2020 Douglas Burke  
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/GraphClass.hs b/src/Swish/GraphClass.hs
--- a/src/Swish/GraphClass.hs
+++ b/src/Swish/GraphClass.hs
@@ -1,7 +1,5 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE DeriveFunctor #-}
-{-# LANGUAGE DeriveFoldable #-}
 {-# LANGUAGE DeriveTraversable #-}
 
 --------------------------------------------------------------------------------
@@ -10,7 +8,7 @@
 -- |
 --  Module      :  GraphClass
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---                 2011, 2012, 2016 Douglas Burke
+--                 2011, 2012, 2016, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -206,7 +204,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012 Douglas Burke
+--    2011, 2012, 2016, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/GraphMatch.hs b/src/Swish/GraphMatch.hs
--- a/src/Swish/GraphMatch.hs
+++ b/src/Swish/GraphMatch.hs
@@ -7,7 +7,7 @@
 -- |
 --  Module      :  GraphMatch
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---                 2011, 2012, 2016, 2018 Douglas Burke
+--                 2011, 2012, 2016, 2018, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -471,7 +471,7 @@
 
 assignLabelMap1 :: (Label lb) => lb -> LabelMap lb -> LabelMap lb
 assignLabelMap1 lab (LabelMap g lvs) = 
-    LabelMap g $ M.insertWith (flip const) lab (g, initVal lab) lvs
+    LabelMap g $ M.insertWith (const id) lab (g, initVal lab) lvs
 
 --  Calculate initial value for a node
 
@@ -671,7 +671,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2016, 2018 Douglas Burke
+--    2011, 2012, 2016, 2018, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/QName.hs b/src/Swish/QName.hs
--- a/src/Swish/QName.hs
+++ b/src/Swish/QName.hs
@@ -5,7 +5,7 @@
 --------------------------------------------------------------------------------
 -- |
 --  Module      :  QName
---  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2013 Douglas Burke
+--  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2013, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -41,8 +41,6 @@
     )
     where
 
-import Control.Monad (liftM)
-
 import Data.Char (isAscii)
 import Data.Maybe (fromMaybe)
 import Data.Interned (intern, unintern)
@@ -209,12 +207,12 @@
       start = QName (intern uri)
   in case uf of
        "#"    -> q0
-       '#':xs -> start (uri {uriFragment = "#"}) `liftM` newLName (T.pack xs)
+       '#':xs -> start (uri {uriFragment = "#"}) `fmap` newLName (T.pack xs)
        ""     -> case break (=='/') (reverse up) of
                    ("",_) -> q0 -- path ends in / or is empty
                    (_,"") -> q0 -- path contains no /
                    (rlname,rpath) -> 
-                       start (uri {uriPath = reverse rpath}) `liftM` 
+                       start (uri {uriPath = reverse rpath}) `fmap` 
                        newLName (T.pack (reverse rlname))
 
        -- e -> error $ "Unexpected: uri=" ++ show uri ++ " has fragment='" ++ show e ++ "'" 
@@ -275,7 +273,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2013 Douglas Burke
+--    2011, 2012, 2013, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/Formatter/Internal.hs b/src/Swish/RDF/Formatter/Internal.hs
--- a/src/Swish/RDF/Formatter/Internal.hs
+++ b/src/Swish/RDF/Formatter/Internal.hs
@@ -7,7 +7,7 @@
 -- |
 --  Module      :  Internal
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---                 2011, 2012, 2013, 2014, 2016, 2018 Douglas Burke
+--                 2011, 2012, 2013, 2014, 2016, 2018, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -74,7 +74,6 @@
                        )
 import Swish.RDF.Vocabulary (LanguageTag, fromLangTag, xsdBoolean, xsdDecimal, xsdInteger, xsdDouble)
 
-import Control.Monad (liftM)
 import Control.Monad.State (State, get, gets, modify, put)
 
 import Data.List (foldl', groupBy, intersperse, partition)
@@ -177,7 +176,7 @@
 -}
 
 hasMore :: (a -> [b]) -> State a Bool
-hasMore lens = (not . null . lens) `liftM` get
+hasMore lens = gets (not . null . lens)
 
 
 {-|
@@ -499,7 +498,7 @@
     -> NamespaceMap
     -> State a B.Builder
 formatPrefixes_ nextLine pmap = 
-    mconcat `liftM` mapM nextLine (formatPrefixLines pmap)
+    mconcat `fmap` mapM nextLine (formatPrefixLines pmap)
 
 formatGraph_ :: 
     (B.Builder -> State a ()) -- set indent
@@ -640,7 +639,7 @@
   put $ updateState ost rsubjs rprops []
   flag <- hasMore props
   txt <- if flag
-         then (`mappend` "\n") `liftM` formatProperties lbl ""
+         then (`mappend` "\n") `fmap` formatProperties lbl ""
          else return ""
 
   -- restore the original data (where appropriate)
@@ -702,7 +701,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2013, 2014, 2016, 2018 Douglas Burke
+--    2011, 2012, 2013, 2014, 2016, 2018, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/Formatter/N3.hs b/src/Swish/RDF/Formatter/N3.hs
--- a/src/Swish/RDF/Formatter/N3.hs
+++ b/src/Swish/RDF/Formatter/N3.hs
@@ -7,7 +7,7 @@
 -- |
 --  Module      :  N3
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---                 2011, 2012, 2014 Douglas Burke
+--                 2011, 2012, 2014, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -105,7 +105,7 @@
   owlSameAs, logImplies
   )
 
-import Control.Monad (liftM, void)
+import Control.Monad (void)
 import Control.Monad.State (State, modify, get, gets, put, runState)
 
 import Data.Char (isDigit)
@@ -192,7 +192,7 @@
 
 {-
 getObjs :: Formatter ([RDFLabel])
-getObjs = objs `liftM` get
+getObjs = objs `fmap` get
 
 setObjs :: [RDFLabel] -> Formatter ()
 setObjs os = do
@@ -344,7 +344,7 @@
 insertBnode SubjContext lbl = do
   flag <- hasMore props
   txt <- if flag
-         then (`mappend` "\n") `liftM` formatProperties lbl ""
+         then (`mappend` "\n") `fmap` formatProperties lbl ""
          else return ""
 
   -- TODO: handle indentation?
@@ -480,7 +480,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012 Douglas Burke
+--    2011, 2012, 2014, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/Formatter/NTriples.hs b/src/Swish/RDF/Formatter/NTriples.hs
--- a/src/Swish/RDF/Formatter/NTriples.hs
+++ b/src/Swish/RDF/Formatter/NTriples.hs
@@ -7,7 +7,7 @@
 -- |
 --  Module      :  NTriples
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---                 2011, 2012, 2013, 2014, 2015 Douglas Burke
+--                 2011, 2012, 2013, 2014, 2015, 2020 Doug  Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -80,7 +80,7 @@
 type Formatter a = State NodeGenState a
 
 _nodeGen :: SLens NodeGenState NodeGenState
-_nodeGen = SLens id $ flip const
+_nodeGen = SLens id $ const id
 
 -- | Convert a RDF graph to NTriples format.
 formatGraphAsText :: RDFGraph -> T.Text
@@ -176,7 +176,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012 Douglas Burke
+--    2011, 2012, 2013, 2014, 2015, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/Formatter/Turtle.hs b/src/Swish/RDF/Formatter/Turtle.hs
--- a/src/Swish/RDF/Formatter/Turtle.hs
+++ b/src/Swish/RDF/Formatter/Turtle.hs
@@ -7,7 +7,7 @@
 -- |
 --  Module      :  Turtle
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---                 2011, 2012, 2013, 2014, 2018, 2019 Douglas Burke
+--                 2011, 2012, 2013, 2014, 2018, 2019, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -94,7 +94,6 @@
 import Control.Applicative ((<$>))
 #endif
 
-import Control.Monad (liftM)
 import Control.Monad.State (State, modify, gets, runState)
 
 import Data.Char (isDigit)
@@ -267,7 +266,7 @@
   flag <- hasMore props
   if flag
     then do
-      txt <- (`mappend` "\n") `liftM` formatProperties lbl ""
+      txt <- (`mappend` "\n") `fmap` formatProperties lbl ""
       return $ mconcat ["[] ", txt]
     else error $ "Internal error: expected properties with label: " ++ show lbl
 
@@ -363,7 +362,7 @@
 formatLabel ctxt (Res sn)
   | ctxt == PredContext && sn == rdfType = return "a"
   | ctxt == ObjContext  && sn == rdfNil  = return "()"
-  | otherwise = formatScopedName sn <$> gets prefixes
+  | otherwise = gets (formatScopedName sn . prefixes)
 
 formatLabel _ (Lit lit) = return $ formatPlainLit lit
 formatLabel _ (LangLit lit lcode) = return $ formatLangLit lit lcode
@@ -382,7 +381,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2013, 2014, 2018 Douglas Burke
+--    2011, 2012, 2013, 2014, 2018, 2019, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/Graph.hs b/src/Swish/RDF/Graph.hs
--- a/src/Swish/RDF/Graph.hs
+++ b/src/Swish/RDF/Graph.hs
@@ -9,7 +9,7 @@
 -- |
 --  Module      :  Graph
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---                 2011, 2012, 2013, 2014, 2015, 2016, 2018 Douglas Burke
+--                 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -1388,7 +1388,7 @@
     "Graph, formulae: " ++ showForm ++ "\n" ++
     p ++ "arcs: " ++ showArcs p g
     where
-        showForm = foldr ((++) . (pp ++) . show) "" fml
+        showForm = concatMap ((pp ++) . show) fml
         fml = map (uncurry Formula) $ M.assocs (getFormulae g) -- NOTE: want to just show 'name :- graph'
         pp = "\n    " ++ p
 
@@ -1595,7 +1595,7 @@
       ns = mapMaybe (fmap getScopeNamespace . getNS) $ S.toList lbls
       nsmap = foldl'
               (\m ins -> let (p,u) = getNamespaceTuple ins
-                         in M.insertWith (flip const) p u m)
+                         in M.insertWith (const id) p u m)
               emptyNamespaceMap ns
   
   in mempty { namespaces = nsmap, statements = arcs }
@@ -1619,7 +1619,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2013, 2014, 2015, 2016, 2018 Douglas Burke
+--    2011, 2012, 2013, 2014, 2015, 2016, 2018, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/GraphShowLines.hs b/src/Swish/RDF/GraphShowLines.hs
--- a/src/Swish/RDF/GraphShowLines.hs
+++ b/src/Swish/RDF/GraphShowLines.hs
@@ -1,12 +1,11 @@
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE TypeSynonymInstances #-}
 
 --------------------------------------------------------------------------------
 --  See end of this file for licence information.
 --------------------------------------------------------------------------------
 -- |
 --  Module      :  GraphShowLines
---  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012 Douglas Burke
+--  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -36,7 +35,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012 Douglas Burke
+--    2011, 2012, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/Parser/N3.hs b/src/Swish/RDF/Parser/N3.hs
--- a/src/Swish/RDF/Parser/N3.hs
+++ b/src/Swish/RDF/Parser/N3.hs
@@ -6,7 +6,7 @@
 --------------------------------------------------------------------------------
 -- |
 --  Module      :  N3
---  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2013, 2014, 2018 Douglas Burke
+--  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2013, 2014, 2018, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
@@ -985,7 +985,7 @@
 restoreState :: N3State -> N3Parser N3State
 restoreState origState = do
   oldState <- stGet
-  stUpdate $ \_ -> origState { nodeGen = nodeGen oldState }
+  stUpdate $ const origState { nodeGen = nodeGen oldState }
   return oldState
 
 {-
@@ -1232,7 +1232,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2013, 2014, 2018 Douglas Burke
+--    2011, 2012, 2013, 2014, 2018, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/RDF/Parser/Turtle.hs b/src/Swish/RDF/Parser/Turtle.hs
--- a/src/Swish/RDF/Parser/Turtle.hs
+++ b/src/Swish/RDF/Parser/Turtle.hs
@@ -6,7 +6,7 @@
 --------------------------------------------------------------------------------
 -- |
 --  Module      :  Turtle
---  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2013, 2014, 2018 Douglas Burke
+--  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2013, 2014, 2018, 2020 Douglas Burke
 --  License     :  GPL V2
 -- 
 --  Maintainer  :  Douglas Burke
@@ -866,8 +866,7 @@
 _exponent = do
   e <- char 'e' <|> char 'E'
   ms <- _leadingSign
-  ep <- _integer
-  return $ L.cons e $ addSign ms ep
+  L.cons e . addSign ms <$> _integer
 
 {-
 [22]	STRING_LITERAL_QUOTE	::=	'"' ([^#x22#x5C#xA#xD] | ECHAR | UCHAR)* '"'
@@ -1036,8 +1035,7 @@
 _percent = do
   ichar '%'
   a <- _hex
-  b <- _hex
-  return $ L.cons '%' $ L.cons a $ L.singleton b
+  L.cons '%' . L.cons a . L.singleton <$> _hex
 
 _hex, _pnLocalEsc :: TurtleParser Char
 _hex = satisfy isHexDigit
@@ -1049,7 +1047,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2013, 2014, 2018 Douglas Burke
+--    2011, 2012, 2013, 2014, 2018, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/Script.hs b/src/Swish/Script.hs
--- a/src/Swish/Script.hs
+++ b/src/Swish/Script.hs
@@ -6,7 +6,7 @@
 --------------------------------------------------------------------------------
 {- |
 Module      :  Script
-Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2014, 2018 Douglas Burke
+Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012, 2014, 2018, 2020 Douglas Burke
 License     :  GPL V2
 
 Maintainer  :  Douglas Burke
@@ -125,7 +125,7 @@
 
 import Text.ParserCombinators.Poly.StateText
 
-import Control.Monad (unless, when, liftM, void)
+import Control.Monad (unless, when, void)
 import Control.Monad.State (modify, gets, lift)
 
 #if (!defined(__GLASGOW_HASKELL__)) || (__GLASGOW_HASKELL__ < 710)
@@ -246,8 +246,7 @@
             ; n <- n3SymLex
             ; let gs = ssGetList n :: SwishStateIO (Either String [RDFGraph])
             ; muri <- maybeURI
-            ; c <- commentText
-            ; return $ ssWriteList muri gs c
+            ; ssWriteList muri gs <$> commentText
             }
 
 --  @merge ( name* ) => name
@@ -317,8 +316,7 @@
             ; igf <- formulaExpr
             ; sts <- many checkStep
             ; commandName "@result"
-            ; rgf <- formulaExpr
-            ; return $ ssCheckProof pn sns igf sts rgf
+            ; ssCheckProof pn sns igf sts <$> formulaExpr
             }
 
 checkStep ::
@@ -502,7 +500,7 @@
         Left  es -> Left es
         Right is -> parseN3 is (muri >>= qnameFromURI)
         
-  in gf `liftM` getResourceData muri
+  in gf `fmap` getResourceData muri
 
 ssWriteList ::
     Maybe URI -> SwishStateIO (Either String [RDFGraph]) -> String
@@ -882,11 +880,8 @@
 --  (Add logic to separate filenames from URIs, and
 --  attempt HTTP GET, or similar.)
 getResourceData :: Maybe URI -> SwishStateIO (Either String L.Text)
-getResourceData muri =
-    case muri of
-        Nothing  -> fromStdin
-        Just uri -> fromUri uri
-    where
+getResourceData = maybe fromStdin fromUri 
+  where
     fromStdin = Right <$> lift LIO.getContents
     fromUri = fromFile
     fromFile uri | uriScheme uri == "file:" = Right `fmap` lift (LIO.readFile $ uriPath uri)
@@ -1486,7 +1481,7 @@
 --------------------------------------------------------------------------------
 --
 --  Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012, 2014, 2018 Douglas Burke
+--    2011, 2012, 2014, 2018, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/src/Swish/VarBinding.hs b/src/Swish/VarBinding.hs
--- a/src/Swish/VarBinding.hs
+++ b/src/Swish/VarBinding.hs
@@ -1,7 +1,6 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeSynonymInstances #-}
 
 --------------------------------------------------------------------------------
 --  See end of this file for licence information.
@@ -9,12 +8,12 @@
 -- |
 --  Module      :  VarBinding
 --  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 
---                 2011, 2012, 2014, 2015, 2016, 2018 Douglas Burke
+--                 2011, 2012, 2014, 2015, 2016, 2018, 2020 Douglas Burke
 --  License     :  GPL V2
 --
 --  Maintainer  :  Douglas Burke
 --  Stability   :  experimental
---  Portability :  CPP, FlexibleInstances, OverloadedStrings, TypeSynonymInstances
+--  Portability :  CPP, FlexibleInstances, OverloadedStrings
 --
 --  This module defines functions for representing and manipulating query
 --  binding variable sets.  This is the key data that mediates between
@@ -480,7 +479,7 @@
 makeVarCompareFilter nam vcomp v1 v2 = VarBindingFilter
     { vbfName   = nam
     , vbfVocab  = [v1,v2]
-    , vbfTest   = \vb -> fromMaybe False (vcomp <$> vbMap vb v1 <*> vbMap vb v2)
+    , vbfTest   = \vb -> Just True == (vcomp <$> vbMap vb v1 <*> vbMap vb v2)
     }
 
 ------------------------------------------------------------
@@ -529,7 +528,7 @@
 --------------------------------------------------------------------------------
 --
 --  (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
---    2011, 2012 Douglas Burke
+--    2011, 2012, 2020 Douglas Burke
 --  All rights reserved.
 --
 --  This file is part of Swish.
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,4 +1,4 @@
 flags: {}
 packages:
 - '.'
-resolver: lts-16.2
+resolver: lts-16.31
diff --git a/swish.cabal b/swish.cabal
--- a/swish.cabal
+++ b/swish.cabal
@@ -1,5 +1,5 @@
 Name:               swish
-Version:            0.10.0.4
+Version:            0.10.0.5
 Stability:          experimental
 License:            LGPL-2.1
 License-file:       LICENSE 
@@ -9,7 +9,7 @@
 Category:           Semantic Web
 Synopsis:           A semantic web toolkit. 
 
-Tested-With:        GHC==8.8.3
+Tested-With:        GHC==8.8.4
 Cabal-Version:      1.18
 Homepage:           https://gitlab.com/dburke/swish
 Bug-reports:        https://gitlab.com/dburke/swish/issues
@@ -59,6 +59,9 @@
 Extra-Source-Files: README.md
                     CHANGELOG
                     stack.yaml
+                    default.nix
+                    shell.nix
+                    .hlint.yaml
 Data-Files:         scripts/*.ss
 
 Source-repository head
@@ -91,7 +94,7 @@
 Library
    Default-Language:    Haskell2010
    Build-Depends:
-      base >= 4.5 && < 4.15,
+      base >= 4.5 && < 4.16,
       containers >= 0.5 && < 0.7,
       directory >= 1.0 && < 1.4,
       filepath >= 1.1 && < 1.5,
