From 5d4cfa912a50e940e17980dc95c534f4a11fcbf5 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Sun, 19 Sep 2021 20:50:25 +0200
Subject: [PATCH] Remove microlens dependency

---
 quasar.cabal                               |  1 -
 src/Quasar/Observable/ObservableHashMap.hs | 30 +++++++++++-----------
 src/Quasar/PreludeExtras.hs                |  4 ---
 3 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/quasar.cabal b/quasar.cabal
index e229439..5dcaca7 100644
--- a/quasar.cabal
+++ b/quasar.cabal
@@ -74,7 +74,6 @@ library
     ghc-prim,
     hashable,
     heaps,
-    microlens-platform,
     mtl,
     record-hasfield,
     stm,
diff --git a/src/Quasar/Observable/ObservableHashMap.hs b/src/Quasar/Observable/ObservableHashMap.hs
index 0539f66..5553d74 100644
--- a/src/Quasar/Observable/ObservableHashMap.hs
+++ b/src/Quasar/Observable/ObservableHashMap.hs
@@ -13,7 +13,6 @@ module Quasar.Observable.ObservableHashMap (
 import Data.HashMap.Strict qualified as HM
 import Data.Maybe (isJust)
 import Language.Haskell.TH.Syntax (mkName, nameBase)
-import Lens.Micro.Platform
 import Quasar.Disposable
 import Quasar.Observable
 import Quasar.Observable.Delta
@@ -33,9 +32,6 @@ data KeyHandle v = KeyHandle {
   keySubscribers :: HM.HashMap Unique (ObservableMessage (Maybe v) -> IO ())
 }
 
-makeLensesWith (lensField .~ (\_ _ -> pure . TopName . mkName . ("_" <>) . nameBase) $ lensRules) ''Handle
-makeLensesWith (lensField .~ (\_ _ -> pure . TopName . mkName . ("_" <>) . nameBase) $ lensRules) ''KeyHandle
-
 instance IsRetrievable (HM.HashMap k v) (ObservableHashMap k v) where
   retrieve (ObservableHashMap mvar) = liftIO $ pure . HM.mapMaybe value . keyHandles <$> readMVar mvar
 instance IsObservable (HM.HashMap k v) (ObservableHashMap k v) where
@@ -44,11 +40,11 @@ instance IsObservable (HM.HashMap k v) (ObservableHashMap k v) where
       update :: Handle k v -> IO (Handle k v, Disposable)
       update handle = do
         callback $ pure $ toHashMap handle
-        unique <- newUnique
-        let handle' = handle & set (_subscribers . at unique) (Just callback)
-        (handle',) <$> synchronousDisposable (unsubscribe unique)
+        key <- newUnique
+        let handle' = handle {subscribers = HM.insert key callback (subscribers handle)}
+        (handle',) <$> synchronousDisposable (unsubscribe key)
       unsubscribe :: Unique -> IO ()
-      unsubscribe unique = modifyHandle_ (pure . set (_subscribers . at unique) Nothing) ohm
+      unsubscribe key = modifyHandle_ (\handle -> pure handle {subscribers = HM.delete key (subscribers handle)}) ohm
 
 instance IsDeltaObservable k v (ObservableHashMap k v) where
   subscribeDelta ohm callback = modifyHandle update ohm
@@ -56,11 +52,11 @@ instance IsDeltaObservable k v (ObservableHashMap k v) where
       update :: Handle k v -> IO (Handle k v, Disposable)
       update handle = do
         callback (Reset $ toHashMap handle)
-        unique <- newUnique
-        let handle' = handle & set (_deltaSubscribers . at unique) (Just callback)
-        (handle',) <$> synchronousDisposable (unsubscribe unique)
+        key <- newUnique
+        let handle' = handle {deltaSubscribers = HM.insert key callback (deltaSubscribers handle)}
+        (handle',) <$> synchronousDisposable (unsubscribe key)
       unsubscribe :: Unique -> IO ()
-      unsubscribe unique = modifyHandle_ (pure . set (_deltaSubscribers . at unique) Nothing) ohm
+      unsubscribe key = modifyHandle_ (\handle -> pure handle {deltaSubscribers = HM.delete key (deltaSubscribers handle)}) ohm
 
 
 toHashMap :: Handle k v -> HM.HashMap k v
@@ -79,7 +75,9 @@ modifyKeyHandle_ :: forall k v. (Eq k, Hashable k) => (KeyHandle v -> IO (KeyHan
 modifyKeyHandle_ f = modifyKeyHandle (fmap (,()) . f)
 
 updateKeyHandle :: forall k v a. (Eq k, Hashable k) => (KeyHandle v -> IO (KeyHandle v, a)) -> k -> Handle k v -> IO (Handle k v, a)
-updateKeyHandle f k = runExtraT . (_keyHandles (HM.alterF updateMaybe k))
+updateKeyHandle f k handle = do
+  (keyHandles', result) <- runExtraT $ HM.alterF updateMaybe k (keyHandles handle)
+  pure (handle {keyHandles = keyHandles'}, result)
   where
     updateMaybe :: Maybe (KeyHandle v) -> ExtraT a IO (Maybe (KeyHandle v))
     updateMaybe = fmap toMaybe . (ExtraT . f) . fromMaybe emptyKeyHandle
@@ -108,7 +106,7 @@ notifySubscribers handle@Handle{deltaSubscribers, subscribers} (Just delta) = do
   mapM_ ($ pure (toHashMap handle)) $ HM.elems subscribers
 
 modifyKeySubscribers :: (HM.HashMap Unique (ObservableMessage (Maybe v) -> IO ()) -> HM.HashMap Unique (ObservableMessage (Maybe v) -> IO ())) -> KeyHandle v -> KeyHandle v
-modifyKeySubscribers = over _keySubscribers
+modifyKeySubscribers fn keyHandle = keyHandle {keySubscribers = fn (keySubscribers keyHandle)}
 
 new :: IO (ObservableHashMap k v)
 new = ObservableHashMap <$> newMVar Handle{keyHandles=HM.empty, subscribers=HM.empty, deltaSubscribers=HM.empty}
@@ -117,7 +115,9 @@ observeKey :: forall k v. (Eq k, Hashable k) => k -> ObservableHashMap k v -> Ob
 observeKey key ohm@(ObservableHashMap mvar) = synchronousFnObservable observeFn retrieveFn
   where
     retrieveFn :: IO (Maybe v)
-    retrieveFn = liftIO $ join . preview (_keyHandles . at key . _Just . _value) <$> readMVar mvar
+    retrieveFn = liftIO do
+      handle <- readMVar mvar
+      pure $ join $ fmap value $ HM.lookup key $ keyHandles handle
     observeFn :: ((ObservableMessage (Maybe v) -> IO ()) -> IO Disposable)
     observeFn callback = do
       subscriptionKey <- newUnique
diff --git a/src/Quasar/PreludeExtras.hs b/src/Quasar/PreludeExtras.hs
index 49d058e..98af4f9 100644
--- a/src/Quasar/PreludeExtras.hs
+++ b/src/Quasar/PreludeExtras.hs
@@ -19,7 +19,6 @@ import Data.Maybe qualified as Maybe
 import GHC.Records.Compat (HasField, getField, setField)
 import GHC.Stack.Types qualified
 import GHC.TypeLits (Symbol)
-import Lens.Micro.Platform (Lens', lens)
 import Quasar.Utils.ExtraT
 
 io :: IO a -> IO a
@@ -110,8 +109,5 @@ splitOn p s = case break p s of
   (w, []) -> [w]
   (w, _:r) -> w : splitOn p r
 
-fieldLens :: forall (x :: Symbol) r a. HasField x r a => Lens' r a
-fieldLens = lens (getField @x) (setField @x)
-
 sleepForever :: IO a
 sleepForever = forever $ threadDelay 1000000000000
-- 
GitLab