Skip to content

Commit 0fcda8e

Browse files
author
Andika Demas Riyandi
committed
cleaning warning and adding Endo style
1 parent 6e86b33 commit 0fcda8e

File tree

4 files changed

+75
-115
lines changed

4 files changed

+75
-115
lines changed

src-ui.v3/src/API.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ module API
7171
import PkgId
7272

7373
import Control.Monad (fail)
74-
import Data.Aeson (FromJSON, ToJSON, decode)
74+
import Data.Aeson (FromJSON, decode)
7575
import qualified Data.Aeson as J
7676
import qualified Data.Aeson.Types as J
7777
import qualified Data.Char as C

src-ui.v3/src/Main.hs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ bodyElement4 = do
114114
-- ticker1 <- tickLossy 1 =<< liftIO getCurrentTime
115115
-- ticker1cnt <- count ticker1
116116

117-
app :: forall t r m. (SetRoute t (NonEmpty FragRoute) m, SupportsServantReflex t m, MonadFix m, MonadIO m, MonadHold t m, PostBuild t m, DomBuilder t m, Adjustable t m, DomBuilderSpace m ~ GhcjsDomSpace)
117+
app :: forall t m. (SetRoute t FragRoute m, SupportsServantReflex t m, MonadFix m, MonadIO m, MonadHold t m, PostBuild t m, DomBuilder t m, Adjustable t m, DomBuilderSpace m ~ GhcjsDomSpace)
118118
=> Dynamic t FragRoute
119119
-> m ()
120120
app dynFrag = do
@@ -707,22 +707,6 @@ findInitialDropDown (Just idx) pkgSet = if Set.member idx pkgSet
707707
else Set.findMax pkgSet
708708
findInitialDropDown Nothing pkgSet = Set.findMax pkgSet
709709

710-
switchPkgRoute :: Set PkgIdxTs -> URI -> PkgIdxTs -> Maybe URI
711-
switchPkgRoute setPkgIdx oldRoute (PkgIdxTs 0) = Nothing
712-
switchPkgRoute setPkgIdx oldRoute idxChange =
713-
let routeS = (T.pack . uriFragment) oldRoute
714-
rootURI = "#/package/"
715-
in case T.stripPrefix rootURI routeS of
716-
Just sfx | (Just pkgN, Just pkgIdx) <- pkgNFromText sfx
717-
, True <- idxChange /= pkgIdx
718-
, True <- not (Set.null setPkgIdx)
719-
, Just setMax <- Set.lookupMax setPkgIdx
720-
-> if setMax == idxChange
721-
then Nothing
722-
else parseURI . T.unpack $ rootURI <> (pkgNToText pkgN) <> (T.pack "@") <> (idxTsToText idxChange)
723-
| otherwise -> Nothing
724-
Nothing -> Nothing
725-
726710
toggleTagSet :: TagN -> Set.Set TagN -> Set.Set TagN
727711
toggleTagSet tn st = if Set.member tn st then Set.delete tn st else Set.insert tn st
728712

src-ui.v3/src/PkgId.hs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ module PkgId
3333
, PkgRev
3434

3535
, UserName
36-
, FragRoute(..), decodeFrag
3736
) where
3837

3938
import Control.Monad (fail)
@@ -176,35 +175,7 @@ matchesEmpty = Matches { matchesInput = T.empty, matchesExact = Map.empty, match
176175

177176
---------------------------------
178177

179-
data FragRoute = RouteHome
180-
| RouteQueue
181-
| RoutePackages
182-
| RoutePackage (PkgN, Maybe PkgIdxTs)
183-
| RouteUser UserName
184-
| RouteUnknown T.Text
185-
deriving (Eq, Ord)
186-
187-
decodeFrag :: T.Text -> FragRoute
188-
decodeFrag frag = case frag of
189-
"" -> RouteHome
190-
"#" -> RouteHome
191-
"#/" -> RouteHome
192-
"#/queue" -> RouteQueue
193-
"#/packages" -> RoutePackages
194-
195-
_ | Just sfx <- T.stripPrefix "#/package/" frag
196-
, not (T.null frag)
197-
, (Just pn, idx) <- pkgNFromText sfx
198-
-> RoutePackage (pn , idx)
199-
200-
| Just sfx <- T.stripPrefix "#/user/" frag
201-
, not (T.null frag)
202-
, T.all (\c -> C.isAsciiLower c || C.isAsciiUpper c || C.isDigit c || c == '_') sfx
203-
-> RouteUser sfx
204-
205-
| otherwise -> RouteUnknown frag
206-
207-
--encodeFrag :: FragRoute -> Maybe
178+
208179

209180

210181

src-ui.v3/src/Router.hs

Lines changed: 72 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -33,51 +33,53 @@ module Router
3333
, routeLink
3434
, routePkgIdxTs
3535
, runRouteViewT
36+
, FragRoute(..), decodeFrag
3637
) where
3738

3839
import Prelude hiding ((.), id)
3940
import Control.Category (Category (..), (.))
4041
import Control.Lens hiding (Bifunctor, bimap, universe, element)
41-
import Control.Monad ((<=<))
4242
import Control.Monad.Fix
4343
import Control.Monad.Primitive
4444
import Control.Monad.Reader
4545
import Control.Monad.Ref
46-
import Control.Monad.Trans.Control
46+
import qualified Data.Char as C
4747
import Data.Coerce
48-
import qualified Data.List.NonEmpty as NE
49-
import Data.List.NonEmpty (NonEmpty)
5048
import qualified Data.Map.Strict as Map
5149
import Data.Monoid
5250
import Data.Proxy
5351
import qualified Data.Set as Set
5452
import Data.Set (Set)
5553
import Data.Text (Text)
5654
import qualified Data.Text as T
57-
import Data.Functor.Compose
5855
import Reflex.Class
5956
import Reflex.Host.Class
6057
import Reflex.PostBuild.Class
6158
import Reflex.TriggerEvent.Class
6259
import Reflex.PerformEvent.Class
6360
import Reflex.EventWriter.Class
6461
import Reflex.EventWriter.Base
65-
import Reflex.Dynamic
6662
import Reflex.Dom.Builder.Class
67-
import Data.Type.Coercion
6863
import Language.Javascript.JSaddle
6964
import Reflex.Dom.Core
7065
import qualified GHCJS.DOM.Types as DOM
7166
import Network.URI
72-
import Data.Maybe (Maybe(..), fromMaybe, isJust)
73-
import qualified Data.List as L
67+
import Data.Maybe (Maybe(..), fromMaybe)
7468

7569
import PkgId
7670

77-
newtype SetRouteT t r m a = SetRouteT { unSetRouteT :: EventWriterT t r m a }
71+
data FragRoute = RouteHome
72+
| RouteQueue
73+
| RoutePackages
74+
| RoutePackage (PkgN, Maybe PkgIdxTs)
75+
| RouteUser UserName
76+
| RouteUnknown T.Text
77+
deriving (Eq, Ord)
78+
79+
newtype SetRouteT t r m a = SetRouteT { unSetRouteT :: EventWriterT t (Endo r) m a }
7880
deriving (Functor, Applicative, Monad, MonadFix, MonadTrans, MonadIO, NotReady t, MonadHold t, MonadSample t, PostBuild t, TriggerEvent t, MonadReflexCreateTrigger t, HasDocument, DomRenderHook t)
7981

80-
instance (Semigroup r, MonadFix m, MonadHold t m, DomBuilder t m) => DomBuilder t (SetRouteT t r m) where
82+
instance (MonadFix m, MonadHold t m, DomBuilder t m) => DomBuilder t (SetRouteT t r m) where
8183
type DomBuilderSpace (SetRouteT t r m) = DomBuilderSpace m
8284
element t cfg child = SetRouteT $ element t cfg $ unSetRouteT child
8385
inputElement = lift . inputElement
@@ -91,15 +93,15 @@ instance HasJSContext m => HasJSContext (SetRouteT t r m) where
9193
mapSetRouteT :: (forall x. m x -> n x) -> SetRouteT t r m a -> SetRouteT t r n a
9294
mapSetRouteT f (SetRouteT x) = SetRouteT (mapEventWriterT f x)
9395

94-
runSetRouteT :: (Semigroup r, Reflex t, Monad m) => SetRouteT t r m a -> m (a, Event t r)
96+
runSetRouteT :: (Reflex t, Monad m) => SetRouteT t r m a -> m (a, Event t (Endo r))
9597
runSetRouteT = runEventWriterT . unSetRouteT
9698

9799
class Reflex t => SetRoute t r m | m -> t r where
98-
setRoute :: Event t r -> m ()
100+
setRoute :: Event t (r -> r) -> m ()
99101
setRoute = setRoute
100102

101-
instance (Semigroup r, Reflex t, Monad m) => SetRoute t r (SetRouteT t r m) where
102-
setRoute = SetRouteT . tellEvent
103+
instance (Reflex t, Monad m) => SetRoute t r (SetRouteT t r m) where
104+
setRoute = SetRouteT . tellEvent . fmap Endo
103105

104106
instance (Monad m, SetRoute t r m) => SetRoute t r (QueryT t q m)
105107

@@ -140,7 +142,7 @@ instance PrimMonad m => PrimMonad (SetRouteT t r m ) where
140142
type PrimState (SetRouteT t r m) = PrimState m
141143
primitive = lift . primitive
142144

143-
instance (Semigroup r, MonadHold t m, Adjustable t m) => Adjustable t (SetRouteT t r m) where
145+
instance (MonadHold t m, Adjustable t m) => Adjustable t (SetRouteT t r m) where
144146
runWithReplace a0 a' = SetRouteT $ runWithReplace (coerce a0) $ coerceEvent a'
145147
traverseIntMapWithKeyWithAdjust f a0 a' = SetRouteT $ traverseIntMapWithKeyWithAdjust (coerce f) (coerce a0) $ coerce a'
146148
traverseDMapWithKeyWithAdjust f a0 a' = SetRouteT $ traverseDMapWithKeyWithAdjust (\k v -> coerce $ f k v) (coerce a0) $ coerce a'
@@ -151,23 +153,7 @@ instance (Monad m, MonadQuery t vs m) => MonadQuery t vs (SetRouteT t r m) where
151153
askQueryResult = lift askQueryResult
152154
queryIncremental = lift . queryIncremental
153155

154-
switchPkgRoute :: Set PkgIdxTs -> URI -> PkgIdxTs -> Maybe URI
155-
switchPkgRoute setPkgIdx oldRoute (PkgIdxTs 0) = Nothing
156-
switchPkgRoute setPkgIdx oldRoute idxChange =
157-
let routeS = (T.pack . uriFragment) oldRoute
158-
rootURI = "#/package/"
159-
in case T.stripPrefix rootURI routeS of
160-
Just sfx | (Just pkgN, Just pkgIdx) <- pkgNFromText sfx
161-
, True <- idxChange /= pkgIdx
162-
, True <- not (Set.null setPkgIdx)
163-
, Just setMax <- Set.lookupMax setPkgIdx
164-
-> if setMax == idxChange
165-
then Nothing
166-
else parseURI . T.unpack $ rootURI <> (pkgNToText pkgN) <> (T.pack "@") <> (idxTsToText idxChange)
167-
| otherwise -> Nothing
168-
Nothing -> Nothing
169-
170-
routeLink :: forall t m a route. ( DomBuilder t m, SetRoute t (NonEmpty FragRoute) m)
156+
routeLink :: forall t m a. ( DomBuilder t m, SetRoute t FragRoute m)
171157
=> Bool -- PreventDefault?
172158
-> Text -- Target route
173159
-> m a -- Child widget
@@ -177,16 +163,16 @@ routeLink True r w = do
177163
& elementConfig_eventSpec %~ addEventSpecFlags (Proxy :: Proxy (DomBuilderSpace m)) Click (\_ -> preventDefault)
178164
& elementConfig_initialAttributes .~ "href" =: r
179165
(e, a) <- element "a" cfg w
180-
setRoute $ (((decodeFrag r) NE.:| []) <$ domEvent Click e)
166+
setRoute $ (switchPkgRoute (Just $ decodeFrag r)) <$ domEvent Click e
181167
return a
182168
routeLink False r w = do
183169
let cfg = (def :: ElementConfig EventResult t (DomBuilderSpace m))
184170
& elementConfig_initialAttributes .~ "href" =: r
185171
(e, a) <- element "a" cfg w
186-
setRoute $ (((decodeFrag r) NE.:| []) <$ domEvent Click e)
172+
setRoute $ (switchPkgRoute (Just $ decodeFrag r)) <$ domEvent Click e
187173
return a
188174

189-
routePkgIdxTs :: forall t m. ( PostBuild t m, MonadHold t m, MonadFix m, DomBuilder t m, SetRoute t (NonEmpty FragRoute) m)
175+
routePkgIdxTs :: forall t m. (PostBuild t m, MonadHold t m, MonadFix m, DomBuilder t m, SetRoute t FragRoute m)
190176
=> PkgN
191177
-> PkgIdxTs
192178
-> Behavior t (Set PkgIdxTs)
@@ -196,50 +182,48 @@ routePkgIdxTs :: forall t m. ( PostBuild t m, MonadHold t m, MonadFix m, DomBuil
196182
routePkgIdxTs pn k0 setIdx opt ddConf = do
197183
dd <- dropdown k0 opt ddConf
198184
let evDD = attach setIdx (updated $ dd ^. dropdown_value)
199-
setRoute $ ((\val -> (createRoutePackage pn val) NE.:| []) <$> evDD)
185+
setRoute $ (switchPkgRoute . (\tup -> createRoutePackage pn tup)) <$> evDD
200186
pure dd
201187

202-
createRoutePackage :: PkgN -> (Set PkgIdxTs, PkgIdxTs) -> FragRoute
203-
createRoutePackage pn (_, PkgIdxTs 0) = RoutePackage (pn, Nothing)
188+
createRoutePackage :: PkgN -> (Set PkgIdxTs, PkgIdxTs) -> Maybe FragRoute
189+
createRoutePackage pn (_, PkgIdxTs 0) = Just $ RoutePackage (pn, Nothing)
204190
createRoutePackage pn (setIdx, pkgIdx)
205191
| Just maxIdx <- Set.lookupMax setIdx
206192
, True <- maxIdx /= pkgIdx
207-
= RoutePackage (pn, Just pkgIdx)
208-
| otherwise = RoutePackage (pn, Nothing)
193+
= Just $ RoutePackage (pn, Just pkgIdx)
194+
| otherwise = Just $ RoutePackage (pn, Nothing)
209195

210196
runRouteViewT :: forall t m a. (TriggerEvent t m, PerformEvent t m, MonadHold t m, MonadJSM m, MonadJSM (Performable m), MonadFix m)
211-
=> (Dynamic t FragRoute -> SetRouteT t (NonEmpty FragRoute) m a)
197+
=> (Dynamic t FragRoute -> SetRouteT t FragRoute m a)
212198
-> m a
213199
runRouteViewT app = mdo
214200
historyState <- manageHistory $ HistoryCommand_PushState <$> setState
215-
dynLoc <- browserHistoryWith getLocationUri
216-
(result, changeStateE) <- runSetRouteT $ app route -- changeStateE :: Event t (NonEmpty Fragroute)
201+
--dynLoc <- browserHistoryWith getLocationUri
202+
(result, changeStateE) <- runSetRouteT $ app route -- changeStateE :: Event t (Endo (Fragroute -> FragRoute)
217203
let
204+
dynLoc = _historyItem_uri <$> historyState
205+
218206
route :: Dynamic t FragRoute
219207
route = decodeFrag . T.pack . uriFragment <$> dynLoc
220208

221-
f (currentHistoryState, oldR) chStateE = -- chState :: NonEmpty Fragroute
222-
let newRoute = switchPkgRoute' oldR chStateE
223-
oldRoute = case encodeFrag oldR of
224-
(Just a) -> a
225-
Nothing -> T.empty
226-
in
227-
HistoryStateUpdate
228-
{ _historyStateUpdate_state = DOM.SerializedScriptValue jsNull
229-
, _historyStateUpdate_title = ""
230-
, _historyStateUpdate_uri = applyEncoding oldRoute newRoute (_historyItem_uri currentHistoryState)
231-
}
232-
setState = attachWith f ( (,) <$> current historyState <*> current route) changeStateE
209+
f (currentHistoryState, oldR) chStateE = -- chState :: Endo (FragRoute -> FragRoute)
210+
let newRoute = encodeFrag $ appEndo chStateE oldR
211+
--oldRoute = case encodeFrag oldR of
212+
-- (Just a) -> a
213+
-- Nothing -> T.empty
214+
in do
215+
oldRoute <- encodeFrag oldR
216+
newUri <- applyEncoding oldRoute newRoute (_historyItem_uri currentHistoryState)
217+
pure $ HistoryStateUpdate
218+
{ _historyStateUpdate_state = DOM.SerializedScriptValue jsNull
219+
, _historyStateUpdate_title = ""
220+
, _historyStateUpdate_uri = Just newUri
221+
}
222+
setState = fmapMaybe id $ attachWith f ( (,) <$> current historyState <*> current route) changeStateE
233223
pure result
234224

235-
switchPkgRoute' :: FragRoute -> NonEmpty FragRoute -> Text
236-
switchPkgRoute' oldFrag nEFrag
237-
| (fragR, _) <- NE.uncons nEFrag
238-
, Just fResult <- encodeFrag fragR
239-
= fResult
240-
| Just oldResult <- encodeFrag oldFrag
241-
= oldResult
242-
| otherwise = T.empty
225+
switchPkgRoute :: Maybe FragRoute -> FragRoute -> FragRoute
226+
switchPkgRoute newFrag oldFrag = fromMaybe oldFrag newFrag
243227

244228
encodeFrag :: FragRoute -> Maybe Text
245229
encodeFrag RouteHome = Just "#/"
@@ -252,7 +236,28 @@ encodeFrag (RoutePackage (pkg, maybeIndex))
252236
encodeFrag (RouteUser usr) = Just $ "#/user/" <> usr
253237
encodeFrag (RouteUnknown _) = Nothing
254238

255-
applyEncoding :: Text -> Text -> URI -> Maybe URI
256-
applyEncoding oldR newR u
239+
applyEncoding :: Text -> Maybe Text -> URI -> Maybe URI
240+
applyEncoding _ Nothing _ = Nothing
241+
applyEncoding oldR (Just newR) u
257242
| oldR /= newR = Just $ u { uriFragment = T.unpack newR }
258-
| otherwise = Nothing
243+
| otherwise = Nothing
244+
245+
decodeFrag :: T.Text -> FragRoute
246+
decodeFrag frag = case frag of
247+
"" -> RouteHome
248+
"#" -> RouteHome
249+
"#/" -> RouteHome
250+
"#/queue" -> RouteQueue
251+
"#/packages" -> RoutePackages
252+
253+
_ | Just sfx <- T.stripPrefix "#/package/" frag
254+
, not (T.null frag)
255+
, (Just pn, idx) <- pkgNFromText sfx
256+
-> RoutePackage (pn , idx)
257+
258+
| Just sfx <- T.stripPrefix "#/user/" frag
259+
, not (T.null frag)
260+
, T.all (\c -> C.isAsciiLower c || C.isAsciiUpper c || C.isDigit c || c == '_') sfx
261+
-> RouteUser sfx
262+
263+
| otherwise -> RouteUnknown frag

0 commit comments

Comments
 (0)