{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "{-# LANGUAGE NegativeLiterals #-}\n",
    "{-# LANGUAGE FlexibleContexts #-}\n",
    "{-# LANGUAGE OverloadedStrings #-}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import Data.Text (Text)\n",
    "import qualified Data.Text as T\n",
    "import qualified Data.Text.IO as TIO\n",
    "\n",
    "import Text.Megaparsec\n",
    "import qualified Text.Megaparsec.Lexer as L\n",
    "-- import Text.Megaparsec.Lexer\n",
    "import Text.Megaparsec.Text (Parser)\n",
    "\n",
    "import qualified Data.IntMap.Strict as M\n",
    "import Data.IntMap.Strict ((!))\n",
    "\n",
    "import qualified Data.Set as S"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "type Pipes = M.IntMap (S.Set Int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>/* Styles used for the Hoogle display in the pager */\n",
       ".hoogle-doc {\n",
       "display: block;\n",
       "padding-bottom: 1.3em;\n",
       "padding-left: 0.4em;\n",
       "}\n",
       ".hoogle-code {\n",
       "display: block;\n",
       "font-family: monospace;\n",
       "white-space: pre;\n",
       "}\n",
       ".hoogle-text {\n",
       "display: block;\n",
       "}\n",
       ".hoogle-name {\n",
       "color: green;\n",
       "font-weight: bold;\n",
       "}\n",
       ".hoogle-head {\n",
       "font-weight: bold;\n",
       "}\n",
       ".hoogle-sub {\n",
       "display: block;\n",
       "margin-left: 0.4em;\n",
       "}\n",
       ".hoogle-package {\n",
       "font-weight: bold;\n",
       "font-style: italic;\n",
       "}\n",
       ".hoogle-module {\n",
       "font-weight: bold;\n",
       "}\n",
       ".hoogle-class {\n",
       "font-weight: bold;\n",
       "}\n",
       ".get-type {\n",
       "color: green;\n",
       "font-weight: bold;\n",
       "font-family: monospace;\n",
       "display: block;\n",
       "white-space: pre-wrap;\n",
       "}\n",
       ".show-type {\n",
       "color: green;\n",
       "font-weight: bold;\n",
       "font-family: monospace;\n",
       "margin-left: 1em;\n",
       "}\n",
       ".mono {\n",
       "font-family: monospace;\n",
       "display: block;\n",
       "}\n",
       ".err-msg {\n",
       "color: red;\n",
       "font-style: italic;\n",
       "font-family: monospace;\n",
       "white-space: pre;\n",
       "display: block;\n",
       "}\n",
       "#unshowable {\n",
       "color: red;\n",
       "font-weight: bold;\n",
       "}\n",
       ".err-msg.in.collapse {\n",
       "padding-top: 0.7em;\n",
       "}\n",
       ".highlight-code {\n",
       "white-space: pre;\n",
       "font-family: monospace;\n",
       "}\n",
       ".suggestion-warning { \n",
       "font-weight: bold;\n",
       "color: rgb(200, 130, 0);\n",
       "}\n",
       ".suggestion-error { \n",
       "font-weight: bold;\n",
       "color: red;\n",
       "}\n",
       ".suggestion-name {\n",
       "font-weight: bold;\n",
       "}\n",
       "</style><span class='err-msg'>&lt;interactive&gt;:5:5: error:<br/>    • Illegal equational constraint Token s ~ Char<br/>      (Use GADTs or TypeFamilies to permit this)<br/>    • When checking the inferred type<br/>        blockCmnt :: forall e s (m :: * -&gt; *). (Token s ~ Char, Text.Megaparsec.Prim.MonadParsec e s m) =&gt; m ()<br/>      In an equation for ‘sc’:<br/>          sc<br/>            = L.space space lineCmnt blockCmnt<br/>            where<br/>                lineCmnt = L.skipLineComment \"//\"<br/>                blockCmnt = L.skipBlockComment \"/*\" \"*/\"<br/>&lt;interactive&gt;:4:5: error:<br/>    • Illegal equational constraint Token s ~ Char<br/>      (Use GADTs or TypeFamilies to permit this)<br/>    • When checking the inferred type<br/>        lineCmnt :: forall e s (m :: * -&gt; *). (Token s ~ Char, Text.Megaparsec.Prim.MonadParsec e s m) =&gt; m ()<br/>      In an equation for ‘sc’:<br/>          sc<br/>            = L.space space lineCmnt blockCmnt<br/>            where<br/>                lineCmnt = L.skipLineComment \"//\"<br/>                blockCmnt = L.skipBlockComment \"/*\" \"*/\"</span>"
      ],
      "text/plain": [
       "<interactive>:5:5: error:\n",
       "    • Illegal equational constraint Token s ~ Char\n",
       "      (Use GADTs or TypeFamilies to permit this)\n",
       "    • When checking the inferred type\n",
       "        blockCmnt :: forall e s (m :: * -> *). (Token s ~ Char, Text.Megaparsec.Prim.MonadParsec e s m) => m ()\n",
       "      In an equation for ‘sc’:\n",
       "          sc\n",
       "            = L.space space lineCmnt blockCmnt\n",
       "            where\n",
       "                lineCmnt = L.skipLineComment \"//\"\n",
       "                blockCmnt = L.skipBlockComment \"/*\" \"*/\"\n",
       "<interactive>:4:5: error:\n",
       "    • Illegal equational constraint Token s ~ Char\n",
       "      (Use GADTs or TypeFamilies to permit this)\n",
       "    • When checking the inferred type\n",
       "        lineCmnt :: forall e s (m :: * -> *). (Token s ~ Char, Text.Megaparsec.Prim.MonadParsec e s m) => m ()\n",
       "      In an equation for ‘sc’:\n",
       "          sc\n",
       "            = L.space space lineCmnt blockCmnt\n",
       "            where\n",
       "                lineCmnt = L.skipLineComment \"//\"\n",
       "                blockCmnt = L.skipBlockComment \"/*\" \"*/\""
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sc :: Parser ()\n",
    "sc = L.space space lineCmnt blockCmnt\n",
    "  where\n",
    "    lineCmnt  = L.skipLineComment \"//\"\n",
    "    blockCmnt = L.skipBlockComment \"/*\" \"*/\"\n",
    "\n",
    "lexeme  = L.lexeme sc\n",
    "integer = lexeme L.integer\n",
    "\n",
    "symb = L.symbol sc\n",
    "\n",
    "\n",
    "pipe = assocify <$> integer <*> (symb \"<->\" *> (integer `sepBy` (symb \",\")))\n",
    "    where assocify a b = (a, b)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Haskell",
   "language": "haskell",
   "name": "haskell"
  },
  "language_info": {
   "codemirror_mode": "ihaskell",
   "file_extension": ".hs",
   "name": "haskell",
   "version": "8.0.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}