packages feed

babynf-0.1.0.2: lib/Data/BAByNF/ABNF/Rules/Repetition.hs

module Data.BAByNF.ABNF.Rules.Repetition
    ( ref
    , rule
    , fromTree
    ) where

import Data.List qualified as List

import Data.BAByNF.Util.Ascii qualified as Ascii

import Data.BAByNF.Core.Tree (Tree)
import Data.BAByNF.Core.Tree qualified as Tree
import Data.BAByNF.ABNF.Rules.Repeat qualified as Repeat
import Data.BAByNF.ABNF.Rules.Element qualified as Element
import Data.BAByNF.ABNF.Model qualified as Model

ref :: Model.Rulename
ref = Model.Rulename (Ascii.stringAsBytesUnsafe "repetition")

rule :: Model.Rule
rule = Model.Rule ref Model.BasicDefinition 
    . Model.Elements
    . Model.Alternation
    . List.singleton
    . Model.Concatenation
    $ 
        [ Model.Repetition Model.NoRepeat 
            . Model.OptionElement
            . Model.Option
            . Model.Alternation
            . List.singleton
            . Model.Concatenation
            . List.singleton
            . Model.Repetition Model.NoRepeat
            $ Model.RulenameElement Repeat.ref
        , Model.Repetition Model.NoRepeat
            $ Model.RulenameElement Element.ref
        ]

fromTree :: Tree Model.Rulename -> Either String Model.Repetition
fromTree tree =
    let rd = maybe (Right Model.NoRepeat) Repeat.fromTree  (Tree.getChildWithRef Repeat.ref tree)
        e = Tree.tryGetChildWithRef Element.ref tree >>= Element.fromTree
     in rd >>= \rd' ->
         e >>= \e' -> return $ Model.Repetition rd' e'