Как переписать асинхронный скрипт для Node.js в Purescript - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь выучить Purescript.Большая часть литературы посвящена абстрактным понятиям, для которых язык, очевидно, очень хорошо подходит;тем не менее, трудно довести эти концепции до чего-то знакомого.

Чтобы лучше понять Purescript и частично оспорить Purescript в процедурной задаче, я хочу переписать очень простой скрипт Node, написанный на Typescript.

Сценарий считывает некоторые входные данные из командной строки, вызывает асинхронную функцию, которая гидратирует (на стороне сервера) хранилище редуксов, а затем выводит некоторые данные на консоль.

import { store } from '../server/store'
import { deep, log, red } from '../src/io'
import { isRehydrated } from './isRehydrated'

async function readRecord(dbName: string, tableName: string, recordId: string) {
  try {
    await isRehydrated()
    const result = store.getState().databases[dbName][tableName][recordId]
    deep(result)
    return 'DONE!'
  } catch (e) {
    return e
  }
}

readRecord(process.argv[2], process.argv[3], process.argv[4]).then(
  m => {
    log(m)
    process.exit()
  },
  e => {
    red(e)
    process.exit()
  }
)

IsЕсть простой способ переписать вышеупомянутый скрипт в Purescript, используя FFI Purescript для вызова импорта Javascript и синтаксиса do для обработки асинхронных процедур?

1 Ответ

0 голосов
/ 21 сентября 2019

Этот ответ находится в стадии разработки.

Main.js

"use strict";

exports.store = require('../../../build_server/server/store/index').store
exports.red = require('../../../build_server/src/io/console').red
exports.deep = require('../../../build_server/src/io/console').deep
exports.isRehydrated = require('../../../build_server/scripts/isRehydrated').isRehydrated
exports.path = require('ramda').path
exports.argv = process.argv
exports.exit = process.exit

Main.purs

module Main where

import Prelude
import Control.Promise (toAff, Promise)
import Data.Array (slice)
import Effect (Effect)
import Effect.Aff (Aff, launchAff_)
import Effect.Class (liftEffect)
import Effect.Console (log)
import Foreign (Foreign)

foreign import isRehydrated :: Unit -> Promise Unit

foreign import red :: ∀ a. a -> Effect Unit

foreign import deep :: ∀ a. a -> Effect Unit

foreign import store :: { getState :: Unit -> { databases :: Foreign } }

foreign import path :: Array String -> Foreign -> Foreign

foreign import argv :: Array String

foreign import exit :: Unit -> Effect Unit

recordPath :: Array String
recordPath = slice 2 5 argv

affLog :: String -> Aff Unit
affLog msg = liftEffect $ log msg

affDeep :: ∀ a. a -> Aff Unit
affDeep m = liftEffect $ deep m

affExit :: Unit -> Aff Unit
affExit unit = liftEffect $ exit unit

isRehydratedAff :: Unit -> Aff Unit
isRehydratedAff unit = toAff (isRehydrated unit)

main :: Effect Unit
main = do
  log "BEGIN EFF"
  launchAff_ do
    affLog "BEGIN AFF"
    isRehydratedAff unit
    affLog "HYDRATED"
    affDeep $ path recordPath (store.getState unit).databases
    affLog "END AFF"
    affExit unit

main.js

require('./src/pursOut/Main/index').main()

На терминале: node main.js

...