mirror of
https://github.com/typeable/elm-ui.git
synced 2024-11-22 09:22:43 +03:00
58 lines
934 B
Elm
58 lines
934 B
Elm
module Accumulation exposing (..)
|
|
|
|
{-| -}
|
|
|
|
import Set
|
|
|
|
|
|
type Style
|
|
= Color String Float Float Float Float
|
|
| Spacing String Float
|
|
| Font String (List String)
|
|
|
|
|
|
key style =
|
|
case style of
|
|
Color k _ _ _ _ ->
|
|
k
|
|
|
|
Spacing k _ ->
|
|
k
|
|
|
|
Font k _ ->
|
|
k
|
|
|
|
|
|
type Element
|
|
= Element (List Style) (List Element)
|
|
| None
|
|
|
|
|
|
render element =
|
|
case element of
|
|
None ->
|
|
[]
|
|
|
|
Element styles children ->
|
|
let
|
|
childrenStyles =
|
|
List.foldr render [] children
|
|
in
|
|
styles ++ childrenStyles
|
|
|
|
|
|
finalize styles =
|
|
List.foldl deduplicate ( Set.empty, [] ) styles
|
|
|
|
|
|
deduplicate style ( cached, styles ) =
|
|
if Set.member (key style) then
|
|
( cached, styles )
|
|
else
|
|
( Set.insert (key style), style :: styles )
|
|
|
|
|
|
toHtml element =
|
|
render element
|
|
|> finalize
|