diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index 2561c5b9..1b80c586 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -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 diff --git a/yesod-form/Yesod/Form/Fields.hs b/yesod-form/Yesod/Form/Fields.hs index ebf4cbbd..2b4ed20d 100644 --- a/yesod-form/Yesod/Form/Fields.hs +++ b/yesod-form/Yesod/Form/Fields.hs @@ -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 diff --git a/yesod-form/Yesod/Form/Functions.hs b/yesod-form/Yesod/Form/Functions.hs index 658c2168..1b27437b 100644 --- a/yesod-form/Yesod/Form/Functions.hs +++ b/yesod-form/Yesod/Form/Functions.hs @@ -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 diff --git a/yesod-form/Yesod/Form/Types.hs b/yesod-form/Yesod/Form/Types.hs index 0405de17..37143aa1 100644 --- a/yesod-form/Yesod/Form/Types.hs +++ b/yesod-form/Yesod/Form/Types.hs @@ -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