Skip to content
Snippets Groups Projects
merge.hs 1.1 KiB
Newer Older
#!/usr/bin/env -S runhaskell --ghc-arg="-Wall" --ghc-arg="-i lib"
{-# LANGUAGE DeriveGeneric, ExplicitNamespaces, OverloadedStrings #-}

import Control.Monad.Except (ExceptT(..), runExceptT)
import Data.Map ((!?))
import Data.Maybe (catMaybes)
import Data.Vector (Vector, toList)
import GEODE.Metadata (Contrastive, Entry, Has(..), PrimaryKey, type(@)(..), indexBy, readNamedTsv, tsvFile)
import System.Environment (getArgs)
import System.Exit (die)
import System.Script (syntax)

merge :: Vector (PrimaryKey @ Entry) -> Vector (PrimaryKey @ Contrastive) -> [PrimaryKey @ Entry @ Contrastive]
merge left right = catMaybes (mergeRow <$> toList right)
  where
    indexed = get <$> indexBy get left
    mergeRow (pK :@: contrastive) =
      (\entry -> (pK :@: entry :@: contrastive)) <$> (indexed !? pK)

main :: IO ()
main = getArgs >>= run
  where
    run [left, right, output] =
      runExceptT (merge
                    <$> ExceptT (readNamedTsv left)
                    <*> ExceptT (readNamedTsv right) )
      >>= either die (tsvFile output)
    run _ = syntax "PRIMARY_KEY.tsv INPUT_METADATA.tsv OUTPUT_METADATA.tsv"