packages feed

chiasma-0.2.0.0: lib/Chiasma/Ui/Measure/Weights.hs

module Chiasma.Ui.Measure.Weights(
  viewWeights,
  normalizeWeights,
  amendAndNormalizeWeights,
) where

import qualified Data.List.NonEmpty as NonEmpty (toList, filter)
import GHC.Float (int2Float)

import Chiasma.Ui.Data.ViewGeometry (ViewGeometry(ViewGeometry))
import Chiasma.Ui.Data.ViewState (ViewState(ViewState))

effectiveWeight :: ViewState -> ViewGeometry -> Maybe Float
effectiveWeight (ViewState minimized) (ViewGeometry _ _ fixedSize _ weight _) =
  if isJust fixedSize || minimized then Just 0 else weight

amendWeights :: NonEmpty (Maybe Float) -> NonEmpty Float
amendWeights weights =
  fmap (fromMaybe emptyWeight) weights
  where
    total = sum (catMaybes $ NonEmpty.toList weights)
    normTotal = if total == 0 then 1 else total
    empties = length (NonEmpty.filter isNothing weights)
    normEmpties = if empties == 0 then 1 else empties
    emptyWeight = normTotal / int2Float normEmpties

normalizeWeights :: NonEmpty Float -> NonEmpty Float
normalizeWeights weights =
  fmap (/ normTotal) weights
  where
    total = sum weights
    normTotal = if total == 0 then 1 else total

amendAndNormalizeWeights :: NonEmpty (Maybe Float) -> NonEmpty Float
amendAndNormalizeWeights = normalizeWeights . amendWeights

viewWeights :: NonEmpty (ViewState, ViewGeometry) -> NonEmpty Float
viewWeights = amendAndNormalizeWeights . fmap (uncurry effectiveWeight)