Use foldl' when possible

This commit is contained in:
Francisco Vallarino 2020-05-30 13:43:37 -03:00
parent 767a458e75
commit 8bd485c2b8
5 changed files with 10 additions and 5 deletions

View File

@ -1,7 +1,8 @@
module Monomer.Event.Core where
import Data.Traversable
import Data.List (foldl')
import Data.Sequence (Seq, (|>))
import Data.Traversable
import qualified Data.Sequence as Seq
import qualified SDL
@ -54,7 +55,7 @@ isUpdateUserState (UpdateUserState _) = True
isUpdateUserState _ = False
getUpdateUserStates :: (Traversable t) => t (EventRequest s) -> Seq (s -> s)
getUpdateUserStates reqs = foldl foldHelper Seq.empty reqs where
getUpdateUserStates reqs = foldl' foldHelper Seq.empty reqs where
foldHelper acc (UpdateUserState fn) = acc |> fn
foldHelper acc _ = acc

View File

@ -8,6 +8,7 @@ import Control.Monad
import Control.Monad.Extra
import Control.Monad.IO.Class
import Control.Monad.State
import Data.List (foldl')
import Data.Maybe
import Data.Sequence (Seq, (><))
import Lens.Micro.Mtl
@ -116,7 +117,7 @@ handleAppEvents mapp app events = do
return newApp
reduceAppEvents :: AppEventHandler s e -> s -> Seq e -> (s, [IO (Maybe e)])
reduceAppEvents appEventHandler app events = foldl reducer (app, []) events where
reduceAppEvents appEventHandler app events = foldl' reducer (app, []) events where
reducer (app, tasks) event = case appEventHandler app event of
State newApp -> (newApp, tasks)
StateEvent newApp newEvent -> reducer (newApp, tasks) newEvent

View File

@ -4,6 +4,7 @@ module Monomer.Widget.Widgets.Grid (empty, hgrid, vgrid) where
import Control.Monad
import Data.Default
import Data.List (foldl')
import Data.Sequence ((|>))
import qualified Data.Sequence as Seq
@ -55,7 +56,7 @@ makeFixedGrid isHorizontal = createContainer {
newIndex = index + if _instanceVisible child then 1 else 0
newViewport = if visible then calcViewport index else def
newArea = (newViewport, newViewport)
assignedAreas = fst $ foldl foldHelper (Seq.empty, 0) children
assignedAreas = fst $ foldl' foldHelper (Seq.empty, 0) children
calcViewport i = Rect (cx i) (cy i) cw ch
cw = if cols > 0 then w / fromIntegral cols else 0
ch = if rows > 0 then h / fromIntegral rows else 0

View File

@ -3,6 +3,7 @@
module Monomer.Widget.Widgets.Stack (hstack, vstack) where
import Control.Monad
import Data.List (foldl')
import Data.Sequence ((<|))
import qualified Data.Sequence as Seq
@ -56,7 +57,7 @@ makeStack isHorizontal = createContainer {
remainderUnit = if remainderExist then max 0 remainderTotal / fromIntegral remainderCount else 0
newViewports = Seq.reverse revViewports
assignedArea = Seq.zip newViewports newViewports
(revViewports, _) = foldl foldHelper (Seq.empty, mStart) childrenPairs
(revViewports, _) = foldl' foldHelper (Seq.empty, mStart) childrenPairs
foldHelper (accum, offset) childPair = (newSize <| accum, offset + rectSelector newSize) where
newSize = resizeChild offset childPair
resizeChild offset childPair = if not (_instanceVisible widgetInstance) then emptyRect else if isHorizontal then hRect else vRect where

View File

@ -47,6 +47,7 @@
- + Rethink Tree.Path import
- + Clean up Seq imports
- Can we generalize _widgetFind?
- What for?
- Where can we use Seq? Does it make sense to use it everywhere? What about Traversable?
- Reorganize Common Types. What do other projects do? They should be simple to import and use
- Create composite widget, on which application itself is based