Skip to content

Commit 67a12f0

Browse files
committed
Style
1 parent 02aabd2 commit 67a12f0

4 files changed

Lines changed: 190 additions & 175 deletions

File tree

ff-core/ff-core.cabal

Lines changed: 60 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,67 @@
1-
cabal-version: >= 1.10
2-
3-
name: ff-core
4-
version: 0
1+
cabal-version: 3.8
2+
name: ff-core
3+
version: 0
54
copyright:
6-
2018 Yuriy Syrovetskiy, Nikolay Loginov;
7-
2019-2020 Yuriy Syrovetskiy
8-
9-
build-type: Simple
5+
2018 Yuriy Syrovetskiy, Nikolay Loginov;
6+
2019-2020, 2026 Yuriy Syrovetskiy
107

118
library
12-
build-depends:
13-
-- global
14-
aeson,
15-
aeson-pretty,
16-
async,
17-
base,
18-
bytestring,
19-
containers,
20-
directory,
21-
filepath,
22-
github,
23-
gitrev,
24-
hashable,
25-
mtl,
26-
optparse-applicative,
27-
pager,
28-
prettyprinter,
29-
prettyprinter-ansi-terminal,
30-
random,
31-
shellwords,
32-
temporary,
33-
terminal-size,
34-
text,
35-
time,
36-
typed-process,
37-
unordered-containers,
38-
vector,
39-
yaml,
9+
-- global
10+
build-depends:
11+
, aeson
12+
, aeson-pretty
13+
, async
14+
, base
15+
, bytestring
16+
, containers
17+
, directory
18+
, filepath
19+
, github
20+
, gitrev
21+
, hashable
22+
, mtl
23+
, optparse-applicative
24+
, pager
25+
, prettyprinter
26+
, prettyprinter-ansi-terminal
27+
, random
28+
, shellwords
29+
, temporary
30+
, terminal-size
31+
, text
32+
, time
33+
, typed-process
34+
, unordered-containers
35+
, vector
36+
, yaml
4037

41-
-- organization
42-
ron,
43-
ron-rdt,
44-
ron-schema,
45-
ron-storage
38+
-- organization
39+
build-depends:
40+
, ron
41+
, ron-rdt
42+
, ron-schema
43+
, ron-storage
4644

47-
default-language: GHC2024
48-
exposed-modules:
49-
FF
50-
FF.CLI
51-
FF.Config
52-
FF.Github
53-
FF.Options
54-
FF.Types
55-
FF.UI
56-
FF.Upgrade
57-
other-modules:
58-
Data.Aeson.Extra
59-
hs-source-dirs: lib
45+
default-language: GHC2024
46+
exposed-modules:
47+
FF
48+
FF.CLI
49+
FF.Config
50+
FF.Github
51+
FF.Options
52+
FF.Types
53+
FF.UI
54+
FF.Upgrade
55+
56+
other-modules: Data.Aeson.Extra
57+
hs-source-dirs: lib
6058

6159
test-suite features
62-
build-depends:
63-
base,
64-
blaze-html,
65-
interpolate
66-
default-language: GHC2024
67-
main-is: Features.hs
68-
type: exitcode-stdio-1.0
60+
build-depends:
61+
, base
62+
, blaze-html
63+
, interpolate
64+
65+
default-language: GHC2024
66+
main-is: Features.hs
67+
type: exitcode-stdio-1.0

ff-core/lib/FF/Upgrade.hs

Lines changed: 112 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,130 +1,146 @@
1-
{-# LANGUAGE AllowAmbiguousTypes #-}
2-
{-# LANGUAGE FlexibleContexts #-}
3-
{-# LANGUAGE LambdaCase #-}
1+
{-# LANGUAGE BlockArguments #-}
42
{-# LANGUAGE MultiWayIf #-}
5-
{-# LANGUAGE NamedFieldPuns #-}
6-
{-# LANGUAGE NoImplicitPrelude #-}
73
{-# LANGUAGE OverloadedStrings #-}
84
{-# LANGUAGE PatternSynonyms #-}
9-
{-# LANGUAGE ScopedTypeVariables #-}
105
{-# LANGUAGE TemplateHaskell #-}
11-
{-# LANGUAGE TypeApplications #-}
6+
{-# LANGUAGE NoImplicitPrelude #-}
7+
8+
module FF.Upgrade (upgradeDatabase) where
129

13-
module FF.Upgrade
14-
( upgradeDatabase
15-
)
16-
where
10+
import RON.Prelude
1711

1812
import qualified Data.Map.Strict as Map
19-
import RON.Data (MonadObjectState, getObjectStateChunk,
20-
reducibleOpType, stateFromWireChunk,
21-
stateToWireChunk)
22-
import RON.Data.LWW (LwwRep (LwwRep))
23-
import RON.Data.ORSet (ORSetRep (ORSetRep))
24-
import RON.Error (Error (Error), MonadE, errorContext, liftMaybe)
25-
import RON.Event (ReplicaClock, getEventUuid)
26-
import RON.Prelude
27-
import RON.Storage.Backend (MonadStorage, changeDocId, getCollections,
28-
getDocuments)
29-
import RON.Storage.FS (Collection, DocId, decodeDocId, docIdFromUuid,
30-
modify)
31-
import RON.Types (Atom (AUuid), ObjectRef (ObjectRef),
32-
Op (Op, opId, payload, refId),
33-
StateChunk (StateChunk), StateFrame, UUID,
34-
WireStateChunk (WireStateChunk, stateType))
35-
import RON.UUID (pattern Zero)
13+
import RON.Data (
14+
MonadObjectState,
15+
getObjectStateChunk,
16+
reducibleOpType,
17+
stateFromWireChunk,
18+
stateToWireChunk,
19+
)
20+
import RON.Data.LWW (LwwRep (LwwRep))
21+
import RON.Data.ORSet (ORSetRep (ORSetRep))
22+
import RON.Error (Error (Error), MonadE, errorContext, liftMaybe)
23+
import RON.Event (ReplicaClock, getEventUuid)
24+
import RON.Storage.Backend (
25+
MonadStorage,
26+
changeDocId,
27+
getCollections,
28+
getDocuments,
29+
)
30+
import RON.Storage.FS (
31+
Collection,
32+
DocId,
33+
decodeDocId,
34+
docIdFromUuid,
35+
modify,
36+
)
37+
import RON.Types (
38+
Atom (AUuid),
39+
ObjectRef (ObjectRef),
40+
Op (Op, opId, payload, refId),
41+
StateChunk (StateChunk),
42+
StateFrame,
43+
UUID,
44+
WireStateChunk (WireStateChunk, stateType),
45+
)
46+
import RON.UUID (pattern Zero)
3647
import qualified RON.UUID as UUID
3748

38-
import FF.Types (Note)
49+
import FF.Types (Note)
3950

4051
upgradeDatabase :: (MonadStorage m) => m ()
4152
upgradeDatabase = do
42-
collections <- getCollections
43-
for_ collections $ \case
44-
"note" -> upgradeNoteCollection
45-
collection -> throwError $ Error ("unsupported type " <> show collection) []
53+
collections <- getCollections
54+
for_ collections $ \case
55+
"note" -> upgradeNoteCollection
56+
collection ->
57+
throwError $ Error ("unsupported type " <> show collection) []
4658

47-
upgradeNoteCollection :: MonadStorage m => m ()
59+
upgradeNoteCollection :: (MonadStorage m) => m ()
4860
upgradeNoteCollection = do
49-
docs <- getDocuments @_ @Note
50-
for_ docs $ \docid -> do
51-
docid' <- upgradeDocId docid
52-
modify docid' $ errorContext ("docid' = " <> show docid') $ do
53-
ObjectRef noteId <- ask
54-
errorContext "convert note" $ convertLwwToSet noteId
55-
mTrack <- note_track_get
56-
whenJust mTrack
57-
$ errorContext "convert track"
58-
. convertLwwToSet
61+
docs <- getDocuments @_ @Note
62+
for_ docs $ \docid -> do
63+
docid' <- upgradeDocId docid
64+
modify docid' $ errorContext ("docid' = " <> show docid') do
65+
ObjectRef noteId <- ask
66+
errorContext "convert note" $ convertLwwToSet noteId
67+
mTrack <- note_track_get
68+
whenJust mTrack
69+
$ errorContext "convert track"
70+
. convertLwwToSet
5971

60-
convertLwwToSet
61-
:: (MonadE m, MonadState StateFrame m, ReplicaClock m) => UUID -> m ()
72+
convertLwwToSet ::
73+
(MonadE m, MonadState StateFrame m, ReplicaClock m) => UUID -> m ()
6274
convertLwwToSet uuid =
63-
errorContext "convertLwwToSet" $ do
64-
frame <- get
65-
chunk@WireStateChunk{stateType} <-
66-
liftMaybe "no such object in chunk" $ Map.lookup uuid frame
67-
if
68-
| stateType == lwwType -> doConvert chunk
69-
| stateType == setType ->
70-
pure () -- OK
71-
| otherwise ->
72-
throwError
73-
$ Error "bad type"
74-
["expected set or lww", Error ("got " <> show stateType) []]
75+
errorContext "convertLwwToSet" do
76+
frame <- get
77+
chunk@WireStateChunk{stateType} <-
78+
liftMaybe "no such object in chunk" $ Map.lookup uuid frame
79+
if
80+
| stateType == lwwType -> doConvert chunk
81+
| stateType == setType ->
82+
pure () -- OK
83+
| otherwise ->
84+
throwError
85+
$ Error
86+
"bad type"
87+
[ "expected set or lww"
88+
, Error ("got " <> show stateType) []
89+
]
7590
where
7691
lwwType = reducibleOpType @LwwRep
7792
setType = reducibleOpType @ORSetRep
7893

7994
doConvert chunk = do
80-
LwwRep lwwRep <- stateFromWireChunk chunk
81-
opMap <-
82-
for (Map.assocs lwwRep) $ \(field, Op{payload}) -> do
83-
opId <- getEventUuid
84-
pure
85-
( opId
86-
, Op{ opId
87-
, refId = Zero
88-
, payload = AUuid field : removeOption payload
89-
}
90-
)
91-
modify'
92-
$ Map.insert uuid
93-
$ stateToWireChunk
94-
$ ORSetRep
95-
$ Map.fromList opMap
95+
LwwRep lwwRep <- stateFromWireChunk chunk
96+
opMap <-
97+
for (Map.assocs lwwRep) $ \(field, Op{payload}) -> do
98+
opId <- getEventUuid
99+
pure
100+
( opId
101+
, Op
102+
{ opId
103+
, refId = Zero
104+
, payload = AUuid field : removeOption payload
105+
}
106+
)
107+
modify'
108+
$ Map.insert uuid
109+
$ stateToWireChunk
110+
$ ORSetRep
111+
$ Map.fromList opMap
96112

97113
removeOption = \case
98-
AUuid u : payload | u == some' -> payload
99-
[AUuid u] | u == none' -> []
100-
payload -> payload
114+
AUuid u : payload | u == some' -> payload
115+
[AUuid u] | u == none' -> []
116+
payload -> payload
101117
where
102118
some' = $(UUID.liftName "some")
103119
none' = $(UUID.liftName "none")
104120

105121
note_track_get :: (MonadE m, MonadObjectState Note m) => m (Maybe UUID)
106122
note_track_get = do
107-
StateChunk stateBody <- getObjectStateChunk
108-
pure $
109-
asum
110-
[ case payload of
111-
AUuid field : AUuid ref : _ | field == track -> Just ref
112-
_ -> Nothing
113-
| Op{refId = Zero, payload} <- stateBody
114-
]
123+
StateChunk stateBody <- getObjectStateChunk
124+
pure
125+
$ asum
126+
[ case payload of
127+
AUuid field : AUuid ref : _ | field == track -> Just ref
128+
_ -> Nothing
129+
| Op{refId = Zero, payload} <- stateBody
130+
]
115131
where
116132
track = $(UUID.liftName "track")
117133

118134
upgradeDocId :: (Collection a, MonadStorage m) => DocId a -> m (DocId a)
119135
upgradeDocId docid = do
120-
let mu = decodeDocId docid
121-
case mu of
122-
Just (True, _) -> pure docid
123-
Just (False, uuid) -> do
124-
let docid' = docIdFromUuid uuid
125-
changeDocId docid docid'
126-
pure docid'
127-
Nothing -> do
128-
docid' <- docIdFromUuid <$> getEventUuid
129-
changeDocId docid docid'
130-
pure docid'
136+
let mu = decodeDocId docid
137+
case mu of
138+
Just (True, _) -> pure docid
139+
Just (False, uuid) -> do
140+
let docid' = docIdFromUuid uuid
141+
changeDocId docid docid'
142+
pure docid'
143+
Nothing -> do
144+
docid' <- docIdFromUuid <$> getEventUuid
145+
changeDocId docid docid'
146+
pure docid'

stack.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ extra-deps:
1313
# - ron-schema-0.9.1
1414
# - ron-storage-0.11
1515
- github: ff-notes/ron
16-
commit: 43cdd3efb778fb7063f43601e2e9496ff57efb02 # 2026-03-15
16+
commit: a842c13db0dfc7b56987f50a4bebfc898df7c569 # 2026-03-16
1717
subdirs: [ron, ron-rdt, ron-schema, ron-storage]
1818

1919
docker:

0 commit comments

Comments
 (0)