packages feed

miso-css-0.0.1: src/Miso/Css/Style/PostAppend.hs

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

module Miso.Css.Style.PostAppend where

import Miso.Css.List ( Append )
import Miso.Css.Segment
    ( BRANCH(Branch),
      MatchScope(NowOrLater, JustNow, AutoClean),
      SubSeg(B) )
import Miso.Css.Sibling ( MatchSiblings )


type family FilterOutFullyMatchedHeadCaseSibling
  siblingBranches siblings firstBranchTail r mts matched bs
  where
    FilterOutFullyMatchedHeadCaseSibling '[] siblings firstBranchTail r  _mts _matched bs =
      FilterOutFullyMatchedHead
        siblings
        (Branch firstBranchTail : r)
        bs
    FilterOutFullyMatchedHeadCaseSibling unmatchedSiblingBranches siblings firstBranchTail r mts matched bs =
      FilterOutFullyMatchedHead
        siblings
        (Branch ('(mts, '[ B], matched, unmatchedSiblingBranches) : firstBranchTail) : r)
        bs

type FilterOutFullyMatchedHead :: [[SubSeg]] -> [BRANCH] -> [BRANCH] -> [BRANCH]
type family FilterOutFullyMatchedHead siblings r bs where
  FilterOutFullyMatchedHead _siblings r '[] = r
  -- empty branch
  FilterOutFullyMatchedHead _siblings _r (Branch '[] : _t) = '[]
  -- matched last branch segment
  FilterOutFullyMatchedHead _siblings _r
    (Branch '[ '( _mts, '[], _matched, '[]) ] : _bs) = '[]

  -- reset segment and copy branch if previous tag relation in NOL
  -- and current relation is JN
  FilterOutFullyMatchedHead siblings r
    (Branch ( '(NowOrLater, '[], matched, '[])
            : '(JustNow, m_next, um_next, sib_next)
            : firstBranchTail
            )
    : bs
    ) =
      FilterOutFullyMatchedHead
        siblings
        ( Branch ( '(JustNow, m_next, um_next, sib_next)
                 : firstBranchTail)
        : Branch ( '(NowOrLater, matched, '[], '[])
                 : '(JustNow, m_next, um_next, sib_next)
                 : firstBranchTail)
        : r
        ) bs

  -- matched head seg in branch
  FilterOutFullyMatchedHead siblings r
    (Branch ( '(mts, '[], _matched, '[]) : firstBranchTail) : bs) =
      FilterOutFullyMatchedHead siblings (Branch firstBranchTail : r) bs
  -- filter siblings after all
  FilterOutFullyMatchedHead siblings r
    (Branch ( '(mts, '[], matched, siblingBranches) : firstBranchTail) : bs) =
      FilterOutFullyMatchedHeadCaseSibling
        (MatchSiblings '[] siblings siblingBranches)
        siblings firstBranchTail r mts matched bs

  -- skip locked
  FilterOutFullyMatchedHead siblings r
    (Branch ( '(_mts, B : unMatched, matched, sib) : firstBranchTail) : bs) =
      FilterOutFullyMatchedHead
        siblings
        (Branch ( '(_mts, B : unMatched, matched, sib) : firstBranchTail) : r) bs

  -- reset
  FilterOutFullyMatchedHead siblings r
    (Branch ( '(NowOrLater, unMatched, matched, sib) : firstBranchTail) : bs) =
      FilterOutFullyMatchedHead siblings
        (Branch ( '(NowOrLater, Append unMatched matched, '[], sib) : firstBranchTail) : r) bs

  -- lock
  FilterOutFullyMatchedHead siblings r
    (Branch ( '(JustNow, unMatched, matched, sib) : firstBranchTail) : bs) =
      FilterOutFullyMatchedHead siblings
        (Branch ( '(JustNow, B : unMatched, matched, sib) : firstBranchTail) : r) bs

  FilterOutFullyMatchedHead siblings r
    (Branch ( '(AutoClean, unMatched, matched, sib) : firstBranchTail) : bs) =
      FilterOutFullyMatchedHead siblings
        (Branch ( '(AutoClean, B : unMatched, matched, sib) : firstBranchTail) : r) bs

type family MapMaybeFilterOutFullyMatchedHeadCase elems children t where
  MapMaybeFilterOutFullyMatchedHeadCase '[] children t =
    MapMaybeFilterOutFullyMatchedHead children t
  MapMaybeFilterOutFullyMatchedHeadCase h children t =
    h : MapMaybeFilterOutFullyMatchedHead children t

type family MapMaybeFilterOutFullyMatchedHead children eacs where
  MapMaybeFilterOutFullyMatchedHead _ '[] = '[]
  MapMaybeFilterOutFullyMatchedHead children (h : t) =
    MapMaybeFilterOutFullyMatchedHeadCase
      (FilterOutFullyMatchedHead children '[] h)
      children
      t