packages feed

hbro-1.7.0.0: library/Hbro/Config.hs

{-# LANGUAGE ConstraintKinds   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes        #-}
-- | General configuration parameters.
-- The recommended way to import this module is:
-- @
-- import Hbro.Config hiding(get, set)
-- import qualified Hbro.Config as Config
-- @
module Hbro.Config (
-- * Types
      Config
    , homePage_
-- * Getter/setter
    , Hbro.Config.get
    , Hbro.Config.set
) where

-- {{{ Imports
import           Hbro.Prelude

import           Control.Concurrent.STM.MonadIO

import           Lens.Micro.Platform as Lens

import           Network.URI  (URI)
import qualified Network.URI  as N
-- }}}

-- | Custom settings provided by the user
data Config = Config URI

homePage_ :: Lens' Config URI
homePage_ f (Config a) = (\b -> Config b) <$> f a

instance Describable Config where
  describe c = "Home page = " <> show (c^.homePage_)

instance Default Config where
  def = Config $ fromJust . N.parseURI $ "https://duckduckgo.com/"

get :: (MonadIO m, MonadReader r m, Has (TVar Config) r) => Lens' Config a -> m a
get l = fmap (view l) (readTVar =<< ask)

set :: (MonadIO m, MonadReader r m, Has (TVar Config) r) => Lens' Config a -> a -> m ()
set l v = void . (`modifyTVar` Lens.set l v) =<< ask