Use a Deque
This commit is contained in:
parent
9d47aa24da
commit
6bc5feced9
@ -46,7 +46,7 @@ library
|
||||
, path-pieces >= 0.1.2 && < 0.3
|
||||
, random >= 1.0.0.2 && < 1.2
|
||||
, resourcet >= 1.2
|
||||
, rio
|
||||
, rio >= 0.1.9
|
||||
, rio-orphans
|
||||
, shakespeare >= 2.0
|
||||
, template-haskell >= 2.11
|
||||
|
||||
@ -765,7 +765,7 @@ fileAFormReq :: RenderMessage site FormMessage
|
||||
fileAFormReq fs = AForm $ do
|
||||
site <- getYesod
|
||||
langs <- reqLangs <$> getRequest
|
||||
WFormData viewsRef mfd <- view id
|
||||
WFormData viewsDeque mfd <- view id
|
||||
ints <- readIORef $ mfdInts mfd
|
||||
let (name, ints') =
|
||||
case fsName fs of
|
||||
@ -796,14 +796,14 @@ $newline never
|
||||
, fvRequired = True
|
||||
}
|
||||
writeIORef (mfdEnctype mfd) Multipart
|
||||
modifyIORef viewsRef $ \views -> views . (fv:)
|
||||
pushBackDeque viewsDeque fv
|
||||
return res
|
||||
|
||||
fileAFormOpt :: FieldSettings site -> AForm site (Maybe FileInfo)
|
||||
fileAFormOpt fs = AForm $ do
|
||||
master <- getYesod
|
||||
langs <- reqLangs <$> getRequest
|
||||
WFormData viewsRef mfd <- view id
|
||||
WFormData viewsDeque mfd <- view id
|
||||
ints <- readIORef $ mfdInts mfd
|
||||
let (name, ints') =
|
||||
case fsName fs of
|
||||
@ -832,7 +832,7 @@ $newline never
|
||||
, fvRequired = False
|
||||
}
|
||||
writeIORef (mfdEnctype mfd) Multipart
|
||||
modifyIORef viewsRef $ \views -> views . (fv:)
|
||||
pushBackDeque viewsDeque fv
|
||||
return res
|
||||
|
||||
incrInts :: Ints -> Ints
|
||||
|
||||
@ -107,9 +107,9 @@ newFormIdent = do
|
||||
|
||||
formToAForm :: MForm site (FormResult a, [FieldView site]) -> AForm site a
|
||||
formToAForm mform = AForm $ do
|
||||
WFormData viewsRef mfd <- view id
|
||||
WFormData viewsDeque mfd <- view id
|
||||
(a, views) <- runRIO mfd mform
|
||||
modifyIORef' viewsRef $ \front -> front . (views++)
|
||||
for_ views $ pushBackDeque viewsDeque
|
||||
pure a
|
||||
|
||||
aFormToForm :: AForm site a
|
||||
@ -162,11 +162,11 @@ wFormToMForm
|
||||
:: WForm site a -- ^ input form
|
||||
-> MForm site (a, [FieldView site]) -- ^ output form
|
||||
wFormToMForm wform = do
|
||||
viewsRef <- newIORef id
|
||||
viewsDeque <- newDeque
|
||||
mfd <- view id
|
||||
a <- runRIO (WFormData viewsRef mfd) wform
|
||||
views <- readIORef viewsRef
|
||||
pure (a, views [])
|
||||
a <- runRIO (WFormData viewsDeque mfd) wform
|
||||
views <- dequeToList viewsDeque
|
||||
pure (a, views)
|
||||
|
||||
-- | Converts a monadic form 'MForm' into another monadic form 'WForm'.
|
||||
--
|
||||
@ -175,9 +175,9 @@ mFormToWForm
|
||||
:: MForm site (a, FieldView site) -- ^ input form
|
||||
-> WForm site a -- ^ output form
|
||||
mFormToWForm mform = do
|
||||
WFormData views mfd <- view id
|
||||
WFormData viewsDeque mfd <- view id
|
||||
(a, view') <- runRIO mfd mform
|
||||
modifyIORef' views $ \front -> front . (view':)
|
||||
pushBackDeque viewsDeque view'
|
||||
pure a
|
||||
|
||||
-- | Converts a form field into monadic form. This field requires a value
|
||||
|
||||
@ -145,7 +145,7 @@ type FileEnv = Map.Map Text [FileInfo]
|
||||
-- @since 1.4.14
|
||||
type WForm site = RIO (WFormData site)
|
||||
data WFormData site = WFormData
|
||||
{ wfdViews :: !(IORef ([FieldView site] -> [FieldView site]))
|
||||
{ wfdViews :: !(BDeque (PrimState IO) (FieldView site))
|
||||
, wfdMfd :: !(MFormData site)
|
||||
}
|
||||
instance HasHandlerData (WFormData site) where
|
||||
|
||||
Loading…
Reference in New Issue
Block a user