[
    {
        "name": "TeaCombine.Effectful.Pair",
        "comment": " Combinators for work with effectful programs (those use @Cms and @Sub).\n\nTODO: add some great docs.\n\n@docs initWith, updateWith, subscribeWith, (<>), (<&>), (<+>)\n\n",
        "unions": [],
        "aliases": [],
        "values": [
            {
                "name": "initWith",
                "comment": " Inits both models (with Cmds).\n",
                "type": "( model2, Cmd msg2 ) -> ( model1, Cmd msg1 ) -> ( Both model1 model2, Cmd (Either msg1 msg2) )"
            },
            {
                "name": "subscribeWith",
                "comment": " Combines two subscriptions.\n",
                "type": "Subscription model2 msg2 -> Subscription model1 msg1 -> Subscription (Both model1 model2) (Either msg1 msg2)"
            },
            {
                "name": "updateWith",
                "comment": " Updates one of two submodels using corresponding subupdate function.\n",
                "type": "Update model2 msg2 -> Update model1 msg1 -> Update (Both model1 model2) (Either msg1 msg2)"
            }
        ],
        "binops": [
            {
                "name": "<&>",
                "comment": " An infix alias for @updateWith.\n",
                "type": "Update model1 msg1 -> Update model2 msg2 -> Update (Both model1 model2) (Either msg1 msg2)",
                "associativity": "left",
                "precedence": 9
            },
            {
                "name": "<+>",
                "comment": " An infix alias for @subscribeWith.\n",
                "type": "Subscription model1 msg1 -> Subscription model2 msg2 -> Subscription (Both model1 model2) (Either msg1 msg2)",
                "associativity": "left",
                "precedence": 9
            },
            {
                "name": "<>",
                "comment": " An infix alias for @initWith.\n",
                "type": "( model1, Cmd msg1 ) -> ( model2, Cmd msg2 ) -> ( Both model1 model2, Cmd (Either msg1 msg2) )",
                "associativity": "left",
                "precedence": 9
            }
        ]
    },
    {
        "name": "TeaCombine.Effectful.Many",
        "comment": " Combinators those help to work with homogenous sets of sub-models\n(in a form of @Array).\n\nTODO: add some great docs.\n\n@docs updateEach, updateAll\n\n",
        "unions": [],
        "aliases": [],
        "values": [
            {
                "name": "updateAll",
                "comment": " Updates an @Array of sub-models using a @List of sub-updates.\n",
                "type": "List (Update model msg) -> Update (Array model) (Ix msg)"
            },
            {
                "name": "updateEach",
                "comment": " Updates each sub-model in @Array using a function\nfrom sub-model index to sub-update.\n",
                "type": "(Int -> Update model msg) -> Update (Array model) (Ix msg)"
            }
        ],
        "binops": []
    },
    {
        "name": "TeaCombine.Pure.Many",
        "comment": " Combinators those help to work with homogenous sets of sub-models\n(in a form of @Array).\n\nTODO: add some great docs\n\n@docs updateEach, updateAll\n",
        "unions": [],
        "aliases": [],
        "values": [
            {
                "name": "updateAll",
                "comment": " Updates an @Array of sub-models using a @List of sub-updates.\n",
                "type": "List (Update model msg) -> Update (Array model) (Ix msg)"
            },
            {
                "name": "updateEach",
                "comment": " Updates each sub-model in @Array using a function\nfrom sub-model index to sub-update.\n",
                "type": "(Int -> Update model msg) -> Update (Array model) (Ix msg)"
            }
        ],
        "binops": []
    },
    {
        "name": "TeaCombine.Pure.Pair",
        "comment": " Combinators for work with pure programs (those doesn't use @Cmd and @Sub).\n\nTODO: add some great docs\n\n@docs initWith, (<>), updateWith, (<&>)\n\n",
        "unions": [],
        "aliases": [],
        "values": [
            {
                "name": "initWith",
                "comment": " Inits two sub-models as pair.\n",
                "type": "model2 -> model1 -> Both model1 model2"
            },
            {
                "name": "updateWith",
                "comment": " Updates one of two sub-models using corresponding sub-update function.\n",
                "type": "Update model2 msg2 -> Update model1 msg1 -> Update (Both model1 model2) (Either msg1 msg2)"
            }
        ],
        "binops": [
            {
                "name": "<&>",
                "comment": " An infix alias for @updateBoth.\n",
                "type": "Update model1 msg1 -> Update model2 msg2 -> Update (Both model1 model2) (Either msg1 msg2)",
                "associativity": "left",
                "precedence": 9
            },
            {
                "name": "<>",
                "comment": " An infix alias for @initWith.\n",
                "type": "model1 -> model2 -> Both model1 model2",
                "associativity": "left",
                "precedence": 9
            }
        ]
    },
    {
        "name": "TeaCombine.Effectful",
        "comment": " A common types for the effectful cominators.\n\nTODO: add some great docs.\n\n@docs Update, Subscription\n\n",
        "unions": [],
        "aliases": [
            {
                "name": "Subscription",
                "comment": " A type alias for the subscription function.\n",
                "args": [
                    "model",
                    "msg"
                ],
                "type": "model -> Sub msg"
            },
            {
                "name": "Update",
                "comment": " A type alias for the effectful update function.\n",
                "args": [
                    "model",
                    "msg"
                ],
                "type": "msg -> model -> ( model, Cmd msg )"
            }
        ],
        "values": [],
        "binops": []
    },
    {
        "name": "TeaCombine.Pure",
        "comment": " A common stuff for the pure combinators.\n\nTODO: add some great docs.\n\n@docs Update\n\n",
        "unions": [],
        "aliases": [
            {
                "name": "Update",
                "comment": " A type alias for the pure update function.\n",
                "args": [
                    "model",
                    "msg"
                ],
                "type": "msg -> model -> model"
            }
        ],
        "values": [],
        "binops": []
    },
    {
        "name": "TeaCombine",
        "comment": " The common types and combinators.\n\nTODO: add some great docs.\n\n@docs View, Both, Ix\n@docs initAll\n@docs viewBoth, (<|>), viewAll, viewEach, viewSome\n@docs joinViews, (<::>), withView, (<::)\n@docs bind, thenBind\n\n",
        "unions": [
            {
                "name": "Ix",
                "comment": " Wrapper type that adds an index.\n",
                "args": [
                    "a"
                ],
                "cases": [
                    [
                        "Ix",
                        [
                            "Int",
                            "a"
                        ]
                    ]
                ]
            }
        ],
        "aliases": [
            {
                "name": "Both",
                "comment": " An alias for the pair of things (product of two types).\n",
                "args": [
                    "a",
                    "b"
                ],
                "type": "( a, b )"
            },
            {
                "name": "View",
                "comment": " An alias for the view function.\n",
                "args": [
                    "model",
                    "msg"
                ],
                "type": "model -> Html msg"
            }
        ],
        "values": [
            {
                "name": "bind",
                "comment": " Makes a function that applies a getter to the model and\nthen modifies result.\nThis is a first step in a \"bind+[thenBind]\"-chain.\n ",
                "type": "(a -> b) -> (model -> a) -> model -> b"
            },
            {
                "name": "initAll",
                "comment": " Just an alias for @Array.fromList (made for convinience).\n",
                "type": "List a -> Array a"
            },
            {
                "name": "joinViews",
                "comment": " Works as @viewBoth but returns a function that produces a list of sub-views.\nThis is a first step of \"joinViews+[withView]\" chain.\n ",
                "type": "View model1 msg1 -> View model2 msg2 -> Both model1 model2 -> List (Html (Either msg1 msg2))"
            },
            {
                "name": "thenBind",
                "comment": " Adds an another step to the \"bind+[thenBind]\"-chain.\n ",
                "type": "(model2 -> a) -> (model1 -> a -> b) -> Both model1 model2 -> b"
            },
            {
                "name": "viewAll",
                "comment": " Returns a list of @Html produced by applying a @List of sub-views\nto the @List of sub-models (like @List.zip does).\n",
                "type": "List (View model msg) -> Array model -> List (Html (Ix msg))"
            },
            {
                "name": "viewBoth",
                "comment": " Combines two sub-views into a pair (@Both).\n",
                "type": "View model1 msg1 -> View model2 msg2 -> Both model1 model2 -> Both (Html (Either msg1 msg2)) (Html (Either msg1 msg2))"
            },
            {
                "name": "viewEach",
                "comment": " Returns a list of @Html produced by applying an index-aware view\nto the each of sub-models.\n",
                "type": "(Int -> View model msg) -> Array model -> List (Html (Ix msg))"
            },
            {
                "name": "viewSome",
                "comment": " Works as @viewEach but returns only some of sub-views.\n",
                "type": "(Int -> Maybe (View model msg)) -> Array model -> List (Html (Ix msg))"
            },
            {
                "name": "withView",
                "comment": " Continues a \"joinViews+[withView]\" chain by adding an another sub-view.\n ",
                "type": "View model2 msg2 -> (model1 -> List (Html msg1)) -> Both model1 model2 -> List (Html (Either msg1 msg2))"
            }
        ],
        "binops": [
            {
                "name": "<::",
                "comment": " An infix alias for @withView.\n ",
                "type": "(model1 -> List (Html msg1)) -> View model2 msg2 -> Both model1 model2 -> List (Html (Either msg1 msg2))",
                "associativity": "left",
                "precedence": 9
            },
            {
                "name": "<::>",
                "comment": " An infix alias for @joinViews.\n ",
                "type": "View model1 msg1 -> View model2 msg2 -> Both model1 model2 -> List (Html (Either msg1 msg2))",
                "associativity": "left",
                "precedence": 9
            },
            {
                "name": "<|>",
                "comment": " An infix version for the @viewBoth.\n",
                "type": "View model1 msg1 -> View model2 msg2 -> Both model1 model2 -> Both (Html (Either msg1 msg2)) (Html (Either msg1 msg2))",
                "associativity": "left",
                "precedence": 9
            }
        ]
    }
]