#!/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"