Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Q
quasar
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jens Nolte
quasar
Commits
ced37626
Commit
ced37626
authored
3 years ago
by
Jens Nolte
Browse files
Options
Downloads
Patches
Plain Diff
Rename ObservableState and type variable names
Co-authored-by:
Jan Beinke
<
git@janbeinke.com
>
parent
aa0dbbd6
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/Quasar/Observable.hs
+38
-36
38 additions, 36 deletions
src/Quasar/Observable.hs
with
38 additions
and
36 deletions
src/Quasar/Observable.hs
+
38
−
36
View file @
ced37626
module
Quasar.Observable
(
--
--
* Observable core types
-- * Observable core types
IsRetrievable
(
..
),
IsObservable
(
..
),
Observable
(
..
),
Observable
Messag
e
(
..
),
Observable
Stat
e
(
..
),
--toObservableUpdate,
---- * ObservableVar
...
...
@@ -25,54 +25,56 @@ module Quasar.Observable (
)
where
import
Control.Applicative
import
Control.Concurrent.MVar
import
Control.Concurrent.STM
import
Control.Monad.Catch
import
Control.Monad.Except
import
Control.Monad.Trans.Maybe
import
Data.HashMap.Strict
qualified
as
HM
import
Data.IORef
import
Data.Unique
import
Quasar.Async
import
Quasar.Future
import
Quasar.Prelude
import
Quasar.MonadQuasar
import
Quasar.MonadQuasar.Misc
import
Quasar.Resources
data
Observable
Messag
e
a
=
Observable
Updat
e
a
data
Observable
Stat
e
a
=
Observable
Valu
e
a
|
ObservableLoading
|
ObservableNotAvailable
SomeException
deriving
stock
(
Show
,
Generic
)
instance
Functor
Observable
Messag
e
where
fmap
fn
(
Observable
Updat
e
x
)
=
Observable
Updat
e
(
fn
x
)
instance
Functor
Observable
Stat
e
where
fmap
fn
(
Observable
Valu
e
x
)
=
Observable
Valu
e
(
fn
x
)
fmap
_
ObservableLoading
=
ObservableLoading
fmap
_
(
ObservableNotAvailable
ex
)
=
ObservableNotAvailable
ex
instance
Applicative
Observable
Messag
e
where
pure
=
Observable
Updat
e
liftA2
fn
(
Observable
Updat
e
x
)
(
Observable
Updat
e
y
)
=
Observable
Updat
e
(
fn
x
y
)
instance
Applicative
Observable
Stat
e
where
pure
=
Observable
Valu
e
liftA2
fn
(
Observable
Valu
e
x
)
(
Observable
Valu
e
y
)
=
Observable
Valu
e
(
fn
x
y
)
liftA2
_
(
ObservableNotAvailable
ex
)
_
=
ObservableNotAvailable
ex
liftA2
_
ObservableLoading
_
=
ObservableLoading
liftA2
_
_
(
ObservableNotAvailable
ex
)
=
ObservableNotAvailable
ex
liftA2
_
_
ObservableLoading
=
ObservableLoading
instance
Monad
Observable
Messag
e
where
(
Observable
Updat
e
x
)
>>=
fn
=
fn
x
instance
Monad
Observable
Stat
e
where
(
Observable
Valu
e
x
)
>>=
fn
=
fn
x
ObservableLoading
>>=
_
=
ObservableLoading
(
ObservableNotAvailable
ex
)
>>=
_
=
ObservableNotAvailable
ex
-- TODO rename or delete
--toObservableUpdate :: MonadThrow m => Observable
Messag
e a -> m (Maybe a)
--toObservableUpdate (Observable
Updat
e value) = pure $ Just value
--toObservableUpdate :: MonadThrow m => Observable
Stat
e a -> m (Maybe a)
--toObservableUpdate (Observable
Valu
e value) = pure $ Just value
--toObservableUpdate ObservableLoading = pure Nothing
--toObservableUpdate (ObservableNotAvailable ex) = throwM ex
class
IsRetrievable
v
a
|
a
->
v
where
retrieve
::
(
MonadQuasar
m
,
MonadIO
m
)
=>
a
->
m
v
class
IsRetrievable
v
o
=>
IsObservable
v
o
|
o
->
v
where
class
IsRetrievable
r
a
|
a
->
r
where
retrieve
::
(
MonadQuasar
m
,
MonadIO
m
)
=>
a
->
m
r
class
IsRetrievable
r
a
=>
IsObservable
r
a
|
a
->
r
where
-- | Register a callback to observe changes. The callback is called when the value changes, but depending on the
-- delivery method (e.g. network) intermediate values may be skipped.
--
...
...
@@ -84,29 +86,29 @@ class IsRetrievable v o => IsObservable v o | o -> v where
-- data.
observe
::
(
MonadQuasar
m
)
=>
o
-- ^ observable
->
ObservableCallback
v
-- ^ callback
=>
a
-- ^ observable
->
ObservableCallback
r
-- ^ callback
->
m
()
observe
observable
=
observe
(
toObservable
observable
)
toObservable
::
o
->
Observable
v
toObservable
::
a
->
Observable
r
toObservable
=
Observable
mapObservable
::
(
v
->
a
)
->
o
->
Observable
a
mapObservable
::
(
r
->
r2
)
->
a
->
Observable
r2
mapObservable
f
=
Observable
.
MappedObservable
f
{-# MINIMAL toObservable | observe #-}
type
ObservableCallback
v
=
Observable
Messag
e
v
->
QuasarSTM
()
type
ObservableCallback
v
=
Observable
Stat
e
v
->
QuasarSTM
()
-- | Existential quantification wrapper for the IsObservable type class.
data
Observable
v
=
forall
o
.
IsObservable
v
o
=>
Observable
o
instance
IsRetrievable
v
(
Observable
v
)
where
data
Observable
r
=
forall
a
.
IsObservable
r
a
=>
Observable
a
instance
IsRetrievable
r
(
Observable
r
)
where
retrieve
(
Observable
o
)
=
retrieve
o
instance
IsObservable
v
(
Observable
v
)
where
instance
IsObservable
r
(
Observable
r
)
where
observe
(
Observable
o
)
=
observe
o
toObservable
=
id
mapObservable
f
(
Observable
o
)
=
mapObservable
f
o
...
...
@@ -148,7 +150,7 @@ instance Applicative Observable where
--observeBlocking
-- :: (IsObservable v o, MonadResourceManager m, MonadIO m, MonadMask m)
-- => o
-- -> (Observable
Messag
e v -> m ())
-- -> (Observable
Stat
e v -> m ())
-- -> m a
--observeBlocking observable handler = do
-- -- `withScopedResourceManager` removes the `observe` callback when the `handler` fails.
...
...
@@ -173,7 +175,7 @@ instance Applicative Observable where
--observeWhile
-- :: (IsObservable v o, MonadResourceManager m, MonadIO m, MonadMask m)
-- => o
-- -> (Observable
Messag
e v -> m (Maybe a))
-- -> (Observable
Stat
e v -> m (Maybe a))
-- -> m a
--observeWhile observable callback = do
-- resultVar <- liftIO $ newIORef unreachableCodePath
...
...
@@ -191,7 +193,7 @@ instance Applicative Observable where
--observeWhile_
-- :: (IsObservable v o, MonadResourceManager m, MonadIO m, MonadMask m)
-- => o
-- -> (Observable
Messag
e v -> m Bool)
-- -> (Observable
Stat
e v -> m Bool)
-- -> m ()
--observeWhile_ observable callback =
-- catch
...
...
@@ -209,7 +211,7 @@ instance IsRetrievable v (ConstObservable v) where
retrieve
(
ConstObservable
x
)
=
pure
x
instance
IsObservable
v
(
ConstObservable
v
)
where
observe
(
ConstObservable
x
)
callback
=
ensureQuasarSTM
$
callback
$
Observable
Updat
e
x
ensureQuasarSTM
$
callback
$
Observable
Valu
e
x
data
MappedObservable
b
=
forall
a
o
.
IsObservable
a
o
=>
MappedObservable
(
a
->
b
)
o
...
...
@@ -270,13 +272,13 @@ instance IsObservable r (LiftA2Observable r) where
-- disposeEventually_ oldDisposable
--
-- disposable <- case message of
-- (Observable
Updat
e x) -> captureDisposable_ $ observe (fn x) (rightCallback keyVar key)
-- (Observable
Valu
e x) -> captureDisposable_ $ observe (fn x) (rightCallback keyVar key)
-- ObservableLoading -> noDisposable <$ callback ObservableLoading
-- (ObservableNotAvailable ex) -> noDisposable <$ callback (ObservableNotAvailable ex)
--
-- liftIO $ atomically $ putTMVar disposableVar disposable
--
-- rightCallback :: TMVar Unique -> Unique -> Observable
Messag
e r -> ResourceManagerIO ()
-- rightCallback :: TMVar Unique -> Unique -> Observable
Stat
e r -> ResourceManagerIO ()
-- rightCallback keyVar key message =
-- bracket
-- -- Take key var to prevent parallel callbacks
...
...
@@ -317,7 +319,7 @@ instance IsObservable r (LiftA2Observable r) where
--
-- liftIO $ atomically $ putTMVar disposableVar disposable
--
-- rightCallback :: TMVar Unique -> Unique -> Observable
Messag
e r -> ResourceManagerIO ()
-- rightCallback :: TMVar Unique -> Unique -> Observable
Stat
e r -> ResourceManagerIO ()
-- rightCallback keyVar key message =
-- bracket
-- -- Take key var to prevent parallel callbacks
...
...
@@ -372,7 +374,7 @@ instance IsObservable r (LiftA2Observable r) where
--
--data FnObservable v = FnObservable {
-- retrieveFn :: ResourceManagerIO (Future v),
-- observeFn :: (Observable
Messag
e v -> ResourceManagerIO ()) -> ResourceManagerIO ()
-- observeFn :: (Observable
Stat
e v -> ResourceManagerIO ()) -> ResourceManagerIO ()
--}
--instance IsRetrievable v (FnObservable v) where
-- retrieve FnObservable{retrieveFn} = liftResourceManagerIO retrieveFn
...
...
@@ -385,7 +387,7 @@ instance IsObservable r (LiftA2Observable r) where
--
---- | Implement an Observable by directly providing functions for `retrieve` and `subscribe`.
--fnObservable
-- :: ((Observable
Messag
e v -> ResourceManagerIO ()) -> ResourceManagerIO ())
-- :: ((Observable
Stat
e v -> ResourceManagerIO ()) -> ResourceManagerIO ())
-- -> ResourceManagerIO (Future v)
-- -> Observable v
--fnObservable observeFn retrieveFn = toObservable FnObservable{observeFn, retrieveFn}
...
...
@@ -393,7 +395,7 @@ instance IsObservable r (LiftA2Observable r) where
---- | Implement an Observable by directly providing functions for `retrieve` and `subscribe`.
--synchronousFnObservable
-- :: forall v.
-- ((Observable
Messag
e v -> ResourceManagerIO ()) -> ResourceManagerIO ())
-- ((Observable
Stat
e v -> ResourceManagerIO ()) -> ResourceManagerIO ())
-- -> IO v
-- -> Observable v
--synchronousFnObservable observeFn synchronousRetrieveFn = fnObservable observeFn retrieveFn
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment