<!DOCTYPE html>
<html
lang="en"
data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
data-a11y-animated-images="system" data-a11y-link-underlines="true"
>
<head>
<meta charset="utf-8">
<link rel="dns-prefetch" href="https://github.githubassets.com">
<link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
<link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
<link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
<link rel="preconnect" href="https://github.githubassets.com" crossorigin>
<link rel="preconnect" href="https://avatars.githubusercontent.com">
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-707b19cf061aa459.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-fc4b867e16562d12.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-93f3c6b445d800ff.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-49511e11e3ed53a8.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-707b19cf061aa459.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fc4b867e16562d12.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-2db8d59cbe087225.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-791e59a1f8b634e0.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-a08991540f7253d8.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-aeaea6b5f1a1a577.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-93f3c6b445d800ff.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-49511e11e3ed53a8.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-507c9f8797b64d1c.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-f74ce15fe4370f96.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-77e8f27cae657ef7.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-95c6d23fc206d719.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-61d370fdb2984fe4.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-a0271da34562fd22.css" />
<style type="text/css">
:root {
--tab-size-preference: 4;
}
pre, code {
tab-size: var(--tab-size-preference);
}
</style>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-9f1db623a2d85734.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-73a0e2225731ad3f.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-9a88888eda68c80c.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-59fc16002818df36.css" />
<script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_enable_background_steps","activity_diff_file_tree","activity_repos_file_tree","activity_repos_overview_header","activity_repos_overview_sidebar","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","billing_billable_licenses_cost_center_bucket_fix","billing_billable_licenses_utc_month_length_fix","billing_cost_center_list_assigned_resources","billing_cost_center_user_level_budgets","billing_discount_threshold_notification","billing_multi_user_cost_center_total_user_count","billing_user_level_budgets","billing_user_level_budgets_manage","blocking_route_query_suspense","ccr_files_changed_model_picker","ccr_mcp_skills_ga","code_quality_enablement_banner_targeting","code_quality_new_repo_selection_card","code_quality_remove_preview","code_view_raf_sticky_lines","code_view_react_header","codespaces_prebuild_region_target_update","coding_agent_effort_selector","coding_agent_tbb_quota_banner","coding_agent_third_party_model_ui","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_automations_pagination","copilot_chat_attach_multiple_images","copilot_chat_auto_mode_picker_paid","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_compact_tables","copilot_chat_docked_panel","copilot_chat_enable_tool_call_logs","copilot_chat_header_reorder","copilot_chat_input_commands","copilot_chat_interspersed_tool_calls","copilot_chat_max_upsell","copilot_chat_minimize_contextual","copilot_chat_model_picker_promotions","copilot_chat_models_browser_cache","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_vision_dotcom_chat_ga_gate","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta_max_plan","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_file_block_ref_matching","copilot_fix_failed_workflows_all_skus","copilot_ftp_hyperspace_upgrade_prompt","copilot_hide_hovercard","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_embedded_skip_copilot_api_token_for_dotcom_context","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_suggestion_pills","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mc_nudges","copilot_mission_control_agent_filtering","copilot_mission_control_agents_page_redesign","copilot_mission_control_environment_list_icons","copilot_mission_control_grouped_tasks_endpoint","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_session_events_ui","copilot_mission_control_session_filters","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_new_task_chat_composer","copilot_org_policy_page_focus_mode","copilot_plans_signups_enabled","copilot_pr_chat_enhancements","copilot_prominent_upgrade_button","copilot_resource_panel","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_sunset","copilot_workbench_ubb","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_surface_persistent_preferences","dashboard_universe_2025_feedback_dialog","disable_customize_option_thread_subscriptions","flex_cta_groups_mvp","ga_enterprise_teams_ui","glc_code_quality_repo_settings_workflow_config","global_nav_react","hide_github_models_ui","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_budget_deep_linking","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_fields_multi_select","issue_inline_avatars","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_lazy_hydrate_agent_tasks","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_checks_refetch_dedupe","merge_status_header_feedback","new_quick_search_dotcom","oauth_authorize_clickjacking_protection","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","property_definition_empty_state_suggestions","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_panel_edit_description","pull_request_stacks_feedback_dialog","pull_request_virtualization_image_estimate","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_code_view_sidebar","react_data_router_tanstack_allowed","react_sandbox_future_tanstack","react_sw_route_component_preload","repo_issues_sidebar_layout","repo_overview_ask_copilot","repos_contributors_limited_default_range","review_involves_filter","rulesets_actor_list_editor","sample_network_conn_type","secret_scanning_pattern_alerts_link","security_center_artifact_filters_popover","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","site_banner_desktop_copilot_app","site_code_quality_page","site_github_app_ga_page","site_github_app_ga_page_highlight","site_global_banner_deprecate_spark","site_global_nav_spark_models_removed","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","update_issue_suggestions","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-3b456c1efccae649.js"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/wp-runtime-9b751e2ca806be75.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-33f393e599bf3cff.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-f4d042302fc4470d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-13e6a2728cb8d6a4.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/78205-75aff589688e0be2.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-11ca965848cde433.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.1e7f02148e415458.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-fe76da6b29217672.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-31e911ea8e9046d3.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-30f4d10f3776b4ac.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/296-cddf2922ea3a416c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/816-29b762091e5033a9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/65637-e357a8be37eda955.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/31721-903cd2b317a8cc03.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/46740-0a6e4901e467cc61.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/91445-097d0f19946d0dd8.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-b7da8d83af75fb7e.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-61be330480dbb508.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-b5a5a1cee32a4b87.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-f791bd0decd4aed1.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-18e2cf4c6aadb3ff.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-cf2029c980a9134b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-lib-1c1e7314c65e556e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/50841-f6411d024525940b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/79039-9238f8fd47d74629.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/88475-e7c45daacb58e0a3.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/26533-36c85461b011ffd5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3609-2a17d1c3e2ce7fe5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/87644-7ec64f4e3cd64d13.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/21880-b24d4bde9914fd6b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/75145-7597929c9020acb6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/29685-9b276fea68fdefcc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/90775-fff03cb223239d89.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/55887-99a4521199610050.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-7e2fb5084b7732ac.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.1d58fed2b705f6e5.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-9b751e2ca806be75.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/19916-9330855a80369373.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/gist-687d2f1129604938.js" defer="defer"></script>
<title>Malli composite schema that reuses the values of the underlying values during data generation · GitHub</title>
<meta name="route-pattern" content="/:user_id/:gist_id(.:format)" data-turbo-transient>
<meta name="route-controller" content="gists_gists" data-turbo-transient>
<meta name="route-action" content="show" data-turbo-transient>
<meta name="fetch-nonce" content="v2:b947ec73-6b20-89de-313a-0116c609293c">
<meta name="current-catalog-service-hash" content="56253a530ab9027b25719525dcbe6007461a3202218f6f5dfce5a601c121cbcb">
<meta name="request-id" content="E3A4:33C94B:527206:5471B1:6A7A03B7" data-pjax-transient="true"/><meta name="html-safe-nonce" content="873fbed326b1ff306c5e61652c2929fe7c5719cc9380db2a4af0b05ab2d90574" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFM0E0OjMzQzk0Qjo1MjcyMDY6NTQ3MUIxOjZBN0EwM0I3IiwidmlzaXRvcl9pZCI6IjgyNDE4MDI4ODg1Nzc5NDI0NTUiLCJyZWdpb25fZWRnZSI6InNlYSIsInJlZ2lvbl9yZW5kZXIiOiJzZWEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="86735353293e9444a620bc4f35fd848819c9c71736a4c20f2237ed26f67d130e" data-pjax-transient="true"/>
<meta name="github-keyboard-shortcuts" content="copilot" data-turbo-transient="true" />
<meta name="selected-link" value="gist_code" data-turbo-transient>
<link rel="assets" href="https://github.githubassets.com/">
<meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">
<meta name="octolytics-url" content="https://collector.github.com/github/collect" />
<meta name="analytics-location" content="/<user-name>/<gist-id>" data-turbo-transient="true" />
<meta name="user-login" content="">
<meta name="viewport" content="width=device-width">
<meta name="description" content="Malli composite schema that reuses the values of the underlying values during data generation - kahn_sort.clj">
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch-gist.xml" title="Gist">
<link rel="fluid-icon" href="https://gist.github.com/fluidicon.png" title="GitHub">
<meta property="fb:app_id" content="1401488693436528">
<meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a" />
<meta name="twitter:image" content="https://github.githubassets.com/assets/gist-og-image-54fd7dc0713e.png" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Malli composite schema that reuses the values of the underlying values during data generation" /><meta name="twitter:description" content="Malli composite schema that reuses the values of the underlying values during data generation - kahn_sort.clj" />
<meta property="og:image" content="https://github.githubassets.com/assets/gist-og-image-54fd7dc0713e.png" /><meta property="og:image:alt" content="Malli composite schema that reuses the values of the underlying values during data generation - kahn_sort.clj" /><meta property="og:site_name" content="Gist" /><meta property="og:type" content="article" /><meta property="og:title" content="Malli composite schema that reuses the values of the underlying values during data generation" /><meta property="og:url" content="https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a" /><meta property="og:description" content="Malli composite schema that reuses the values of the underlying values during data generation - kahn_sort.clj" /><meta property="article:author" content="262588213843476" /><meta property="article:publisher" content="262588213843476" />
<meta name="hostname" content="gist.github.com">
<meta name="expected-hostname" content="gist.github.com">
<meta http-equiv="x-pjax-version" content="63d28a1a658a7e68d43c891482f42ca86645a059eee55c2a9b75a9247a5795b8" data-turbo-track="reload">
<meta http-equiv="x-pjax-csp-version" content="2af6a6627810d190be616096b617c8f37a1419b9435f76190f0e0d7638222ac1" data-turbo-track="reload">
<meta http-equiv="x-pjax-css-version" content="aab56b7a06d96efab603e4fb10c1b3eb31abcef7c225f11b2a8af05d83187a0f" data-turbo-track="reload">
<meta http-equiv="x-pjax-js-version" content="0f54e72706ff577fdc4c94b4ac5455a54715ab4bb9db0cac15682d3ffb6b94ad" data-turbo-track="reload">
<meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">
<link href="/jeroenvandijk.atom" rel="alternate" title="atom" type="application/atom+xml">
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/gist-95a09644bcb9cd5f.css" />
<meta name="turbo-body-classes" content="logged-out env-production page-responsive">
<meta name="disable-turbo" content="false">
<meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">
<meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">
<meta name="release" content="37e81f4d8b0891de84cb56da950a54760a409821" data-turbo-track="reload">
<meta name="ui-target" content="full">
<link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
<link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
<link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">
<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />
</head>
<body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
<div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
<div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
<div class="position-relative header-wrapper js-header-wrapper ">
<a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>
<span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
<span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-9fd99fd6e2426d74.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/63211-fb5d39ac620e02bb.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/71393-dc1516dc49efc6b7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2927-6545834de562a1fe.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/24383-465aa6f1cd4778c3.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/65390-8192b87a390f0f9d.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/40062-12e416bb1f39e0b1.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-c7ff7c086b7f2b66.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.7f0ca5394f3ec1ed.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.c948f7d92a06ccaf.module.css" />
<react-partial
partial-name="keyboard-shortcuts-dialog"
data-ssr="false"
data-attempted-ssr="false"
data-react-profiling="false"
>
<script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
<div data-target="react-partial.reactRoot"></div>
</react-partial>
<div class="Header js-details-container Details flex-wrap flex-md-nowrap p-responsive" role="banner" >
<div class="Header-item d-none d-md-flex">
<a class="Header-link" data-hotkey="g d" aria-label="Gist Homepage " style="--focus-outlineColor: #fff;" href="/">
<svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github v-align-middle d-inline-block d-md-none">
<path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
<svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 74 24" version="1.1" width="74" data-view-component="true" class="octicon octicon-logo-github v-align-middle d-none d-md-inline-block">
<path d="M8.472 3.088c4.225 0 6.777 1.805 7.592 4.841l-3.785.902c-.462-1.65-1.783-2.552-3.807-2.552-3.015 0-4.643 1.98-4.643 5.743s1.584 5.787 4.555 5.787c2.502 0 4.079-1.406 4.323-3.829H8.076v-3.168h8.45v2.002c0 5.26-3.059 8.186-8.208 8.186C3.213 21 0 17.501 0 12.022c0-5.48 3.279-8.934 8.472-8.934M51.62 15.741c0 1.518.682 2.355 1.98 2.355 1.496 0 2.64-1.387 2.64-3.28V8.304h3.5V20.67h-3.5v-2.09c-.66 1.342-2.244 2.31-3.938 2.31-2.707 0-4.181-1.496-4.181-4.225V8.303h3.499z"></path><path fill-rule="evenodd" d="M65.063 10.57C65.775 9.073 67.38 8.017 69 8.017c3.375 0 5.157 2.333 5.04 6.448.118 4.07-1.73 6.425-5.04 6.425-1.686 0-3.226-.968-3.96-2.355v2.135h-3.477V3.418h3.499zm2.706.374c-1.444 0-2.588 1.408-2.707 3.345v.198c.119 2.002 1.263 3.476 2.707 3.476 1.813 0 2.803-1.342 2.685-3.498.118-2.179-.872-3.521-2.685-3.521"></path><path d="M21.323 20.67h-3.477V8.303h3.477zm7.004-12.367h2.575v2.905h-2.575v5.611c0 .682.308.946.99.946h1.585v2.905h-2.839c-2.31 0-3.212-.99-3.212-3.08v-6.382H22.65V8.303h2.2V5.84l3.477-.814zm7.783-4.885v6.998h6.557V3.418h3.741V20.67h-3.74v-6.91H36.11v6.91h-3.74V3.418zM19.584 3c1.167 0 2.069.902 2.069 2.069a2.04 2.04 0 0 1-2.069 2.068 2.04 2.04 0 0 1-2.068-2.068c0-1.167.902-2.069 2.068-2.069"></path>
</svg>
<svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 38 24" version="1.1" width="38" data-view-component="true" class="octicon octicon-logo-gist v-align-middle d-none d-md-inline-block">
<path d="M7.05 13.095v-1.5h5.28v8.535c-1.17.555-2.925.96-5.385.96C1.665 21.09 0 17.055 0 12.045S1.695 3 6.945 3c2.43 0 3.96.495 4.92.99v1.575c-1.83-.75-3-1.095-4.92-1.095-3.855 0-5.22 3.315-5.22 7.59s1.365 7.575 5.205 7.575c1.335 0 2.97-.105 3.795-.51v-6.03H7.05Zm16.47 1.035h.045c3.33.3 4.125 1.425 4.125 3.345 0 1.815-1.14 3.615-4.71 3.615-1.125 0-2.745-.285-3.495-.585v-1.41c.705.255 1.83.54 3.495.54 2.43 0 3.09-1.035 3.09-2.13 0-1.065-.33-1.815-2.655-2.01-3.39-.3-4.095-1.5-4.095-3.12 0-1.665 1.08-3.465 4.38-3.465 1.095 0 2.34.135 3.375.585v1.41c-.915-.3-1.83-.54-3.405-.54-2.325 0-2.82.855-2.82 2.01 0 1.035.42 1.56 2.67 1.755Zm12.87-4.995v1.275h-3.63v7.305c0 1.425.795 2.01 2.25 2.01.3 0 .63 0 .915-.045v1.335c-.255.045-.75.075-1.035.075-1.965 0-3.75-.9-3.75-3.195v-7.5H28.8v-.72l2.34-.66V5.85l1.62-.465v3.75h3.63ZM16.635 9.09v9.615c0 .81.285 1.05 1.005 1.05v1.335c-1.71 0-2.58-.705-2.58-2.58V9.09h1.575Zm.375-3.495c0 .66-.51 1.17-1.17 1.17a1.14 1.14 0 0 1-1.155-1.17c0-.66.48-1.17 1.155-1.17s1.17.51 1.17 1.17Z"></path>
</svg>
</a>
</div>
<div class="Header-item d-md-none">
<button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="Header-link js-details-target btn-link"> <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-three-bars">
<path d="M3.75 5.25a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75Zm0 6a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75Zm0 6a.75.75 0 0 0 0 1.5h16.5a.75.75 0 0 0 0-1.5H3.75Z"></path>
</svg>
</button> </div>
<div class="Header-item Header-item--full js-site-search flex-column flex-md-row width-full flex-order-2 flex-md-order-none mr-0 tmp-mr-md-3 tmp-mt-3 tmp-mt-md-0 Details-content--hidden-not-important d-md-flex">
<div class="header-search flex-self-stretch flex-md-self-auto mr-0 tmp-mr-md-3 tmp-mb-3 tmp-mb-md-0">
<!-- '"` --><!-- </textarea></xmp> --></option></form><form data-turbo="false" action="/search" accept-charset="UTF-8" method="get">
<div class="d-flex">
<primer-text-field class="FormControl width-full FormControl--fullWidth">
<label id="label-1c809d3a-643e-4815-b35c-f798c8ad7119" class="sr-only FormControl-label" for="q">
Search Gists
</label>
<div class="FormControl-input-wrap">
<input placeholder="Search..." aria-describedby="validation-1c809d3a-643e-4815-b35c-f798c8ad7119" data-target="primer-text-field.inputElement " class="form-control FormControl-input FormControl-medium rounded-right-0" type="text" name="q" id="q" />
</div>
<div class="FormControl-inlineValidation" id="validation-1c809d3a-643e-4815-b35c-f798c8ad7119" hidden="hidden">
<span class="FormControl-inlineValidation--visual" data-target="primer-text-field.validationSuccessIcon" hidden><svg aria-hidden="true" data-component="Octicon" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-check-circle-fill">
<path d="M6 0a6 6 0 1 1 0 12A6 6 0 0 1 6 0Zm-.705 8.737L9.63 4.403 8.392 3.166 5.295 6.263l-1.7-1.702L2.356 5.8l2.938 2.938Z"></path>
</svg></span>
<span class=" FormControl-inlineValidation--visual" data-target="primer-text-field.validationErrorIcon"><svg aria-hidden="true" data-component="Octicon" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">
<path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>
</svg></span>
<span></span>
</div>
</primer-text-field>
<button id="icon-button-01c9f24f-0e67-4eef-b421-b5dd7c794979" aria-labelledby="tooltip-6d695cdb-baaa-4862-bc31-e42d1a75ddb2" type="submit" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium rounded-left-0"> <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search Button-visual">
<path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
</svg>
</button><tool-tip id="tooltip-6d695cdb-baaa-4862-bc31-e42d1a75ddb2" for="icon-button-01c9f24f-0e67-4eef-b421-b5dd7c794979" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Search Gists</tool-tip>
</div>
</form></div>
<nav aria-label="Global" class="d-flex flex-column flex-md-row flex-self-stretch flex-md-self-auto">
<a class="Header-link mr-0 tmp-mr-md-3 py-2 py-md-0 border-top border-md-top-0 border-white-fade" data-ga-click="Header, go to all gists, text:all gists" href="/discover">All gists</a>
<a class="Header-link mr-0 tmp-mr-md-3 py-2 py-md-0 border-top border-md-top-0 border-white-fade" data-ga-click="Header, go to GitHub, text:Back to GitHub" href="https://github.com">Back to GitHub</a>
<a class="Header-link d-block d-md-none mr-0 tmp-mr-md-3 py-2 py-md-0 border-top border-md-top-0 border-white-fade" data-ga-click="Header, sign in" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"gist header","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="5cf407888d27db29c4bdf90a71f2f4114f1f6acf5800a4dccea3785970fe56a4" href="https://gist.github.com/auth/github?return_to=https%3A%2F%2Fgist.github.com%2Fjeroenvandijk%2F5e0785f25f7fdfeac7bc7a0be72cb62a">
Sign in
</a>
<a class="Header-link d-block d-md-none mr-0 tmp-mr-md-3 py-2 py-md-0 border-top border-md-top-0 border-white-fade" data-ga-click="Header, sign up" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"gist header","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="f53ce038a50d09e43820048d3f3b2688700f1548ad9cc44a9bf79c279e94ea60" href="/join?return_to=https%3A%2F%2Fgist.github.com%2Fjeroenvandijk%2F5e0785f25f7fdfeac7bc7a0be72cb62a&source=header-gist">
Sign up
</a></nav>
</div>
<div class="Header-item Header-item--full flex-justify-center d-md-none position-relative">
<a class="Header-link" data-hotkey="g d" aria-label="Gist Homepage " style="--focus-outlineColor: #fff;" href="/">
<svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github v-align-middle d-inline-block d-md-none">
<path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
<svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 74 24" version="1.1" width="74" data-view-component="true" class="octicon octicon-logo-github v-align-middle d-none d-md-inline-block">
<path d="M8.472 3.088c4.225 0 6.777 1.805 7.592 4.841l-3.785.902c-.462-1.65-1.783-2.552-3.807-2.552-3.015 0-4.643 1.98-4.643 5.743s1.584 5.787 4.555 5.787c2.502 0 4.079-1.406 4.323-3.829H8.076v-3.168h8.45v2.002c0 5.26-3.059 8.186-8.208 8.186C3.213 21 0 17.501 0 12.022c0-5.48 3.279-8.934 8.472-8.934M51.62 15.741c0 1.518.682 2.355 1.98 2.355 1.496 0 2.64-1.387 2.64-3.28V8.304h3.5V20.67h-3.5v-2.09c-.66 1.342-2.244 2.31-3.938 2.31-2.707 0-4.181-1.496-4.181-4.225V8.303h3.499z"></path><path fill-rule="evenodd" d="M65.063 10.57C65.775 9.073 67.38 8.017 69 8.017c3.375 0 5.157 2.333 5.04 6.448.118 4.07-1.73 6.425-5.04 6.425-1.686 0-3.226-.968-3.96-2.355v2.135h-3.477V3.418h3.499zm2.706.374c-1.444 0-2.588 1.408-2.707 3.345v.198c.119 2.002 1.263 3.476 2.707 3.476 1.813 0 2.803-1.342 2.685-3.498.118-2.179-.872-3.521-2.685-3.521"></path><path d="M21.323 20.67h-3.477V8.303h3.477zm7.004-12.367h2.575v2.905h-2.575v5.611c0 .682.308.946.99.946h1.585v2.905h-2.839c-2.31 0-3.212-.99-3.212-3.08v-6.382H22.65V8.303h2.2V5.84l3.477-.814zm7.783-4.885v6.998h6.557V3.418h3.741V20.67h-3.74v-6.91H36.11v6.91h-3.74V3.418zM19.584 3c1.167 0 2.069.902 2.069 2.069a2.04 2.04 0 0 1-2.069 2.068 2.04 2.04 0 0 1-2.068-2.068c0-1.167.902-2.069 2.068-2.069"></path>
</svg>
<svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 38 24" version="1.1" width="38" data-view-component="true" class="octicon octicon-logo-gist v-align-middle d-none d-md-inline-block">
<path d="M7.05 13.095v-1.5h5.28v8.535c-1.17.555-2.925.96-5.385.96C1.665 21.09 0 17.055 0 12.045S1.695 3 6.945 3c2.43 0 3.96.495 4.92.99v1.575c-1.83-.75-3-1.095-4.92-1.095-3.855 0-5.22 3.315-5.22 7.59s1.365 7.575 5.205 7.575c1.335 0 2.97-.105 3.795-.51v-6.03H7.05Zm16.47 1.035h.045c3.33.3 4.125 1.425 4.125 3.345 0 1.815-1.14 3.615-4.71 3.615-1.125 0-2.745-.285-3.495-.585v-1.41c.705.255 1.83.54 3.495.54 2.43 0 3.09-1.035 3.09-2.13 0-1.065-.33-1.815-2.655-2.01-3.39-.3-4.095-1.5-4.095-3.12 0-1.665 1.08-3.465 4.38-3.465 1.095 0 2.34.135 3.375.585v1.41c-.915-.3-1.83-.54-3.405-.54-2.325 0-2.82.855-2.82 2.01 0 1.035.42 1.56 2.67 1.755Zm12.87-4.995v1.275h-3.63v7.305c0 1.425.795 2.01 2.25 2.01.3 0 .63 0 .915-.045v1.335c-.255.045-.75.075-1.035.075-1.965 0-3.75-.9-3.75-3.195v-7.5H28.8v-.72l2.34-.66V5.85l1.62-.465v3.75h3.63ZM16.635 9.09v9.615c0 .81.285 1.05 1.005 1.05v1.335c-1.71 0-2.58-.705-2.58-2.58V9.09h1.575Zm.375-3.495c0 .66-.51 1.17-1.17 1.17a1.14 1.14 0 0 1-1.155-1.17c0-.66.48-1.17 1.155-1.17s1.17.51 1.17 1.17Z"></path>
</svg>
</a>
</div>
<div class="Header-item f4 mr-0" role="navigation" aria-label="Sign in or sign up">
<a class="Header-link no-underline tmp-mr-3" data-ga-click="Header, sign in" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"gist header","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="5cf407888d27db29c4bdf90a71f2f4114f1f6acf5800a4dccea3785970fe56a4" href="https://gist.github.com/auth/github?return_to=https%3A%2F%2Fgist.github.com%2Fjeroenvandijk%2F5e0785f25f7fdfeac7bc7a0be72cb62a">
Sign in
</a> <a class="Header-link d-inline-block no-underline border color-border-default rounded px-2 py-1" data-ga-click="Header, sign up" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"gist header","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="f53ce038a50d09e43820048d3f3b2688700f1548ad9cc44a9bf79c279e94ea60" href="/join?return_to=https%3A%2F%2Fgist.github.com%2Fjeroenvandijk%2F5e0785f25f7fdfeac7bc7a0be72cb62a&source=header-gist">
Sign up
</a> </div>
</div>
<div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
<span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
<span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
<span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
<button id="icon-button-8d113b04-d35f-46d1-8884-aeaf7f0c06e0" aria-labelledby="tooltip-e197cf3c-391b-42f9-a671-6e4c616fc2ce" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-e197cf3c-391b-42f9-a671-6e4c616fc2ce" for="icon-button-8d113b04-d35f-46d1-8884-aeaf7f0c06e0" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>
</div>
</div>
<div id="start-of-content" class="show-on-focus"></div>
<div id="js-flash-container" class="flash-container" data-turbo-replace>
<template class="js-flash-template">
<div class="flash flash-full {{ className }}">
<div >
<button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button>
<div aria-atomic="true" role="alert" class="js-flash-alert">
<div>{{ message }}</div>
</div>
</div>
</div>
</template>
</div>
<div
class="application-main "
data-commit-hovercards-enabled
data-discussion-hovercards-enabled
data-issue-and-pr-hovercards-enabled
data-project-hovercards-enabled
>
<div itemscope itemtype="http://schema.org/Code">
<main id="gist-pjax-container">
<div class="gist-detail-intro gist-banner tmp-pb-3">
<div class="text-center container-lg tmp-px-3">
<p class="lead">
Instantly share code, notes, and snippets.
</p>
</div>
</div>
<div class="gisthead pagehead pb-0 tmp-pt-3 tmp-mb-4">
<div class="px-0">
<div class="tmp-mb-3 d-flex tmp-px-3 tmp-px-md-3 tmp-px-lg-5">
<div class="flex-auto min-width-0 width-fit tmp-mr-3">
<div class="d-flex">
<div class="d-none d-md-block">
<a class="mr-2 flex-shrink-0" data-hovercard-type="user" data-hovercard-url="/users/jeroenvandijk/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/jeroenvandijk"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/27645?s=64&v=4" width="32" height="32" alt="@jeroenvandijk" /></a>
</div>
<div class="d-flex flex-column width-full">
<div class="d-flex flex-row width-full">
<h1 class="wb-break-word f3 text-normal mb-md-0 mb-1">
<span class="author"><a data-hovercard-type="user" data-hovercard-url="/users/jeroenvandijk/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/jeroenvandijk">jeroenvandijk</a></span><!--
--><span class="mx-1 color-fg-muted">/</span><!--
--><strong itemprop="name" class="css-truncate-target mr-1" style="max-width: 410px"><a href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a">kahn_sort.clj</a></strong>
</h1>
</div>
<div class="note m-0">
Last active
<relative-time tense="past" datetime="2022-01-20T18:16:44Z" data-view-component="true">January 20, 2022 18:16</relative-time>
</div>
</div>
</div>
</div>
<ul class="d-md-flex pagehead-actions float-none mr-2">
</ul>
<div class="d-inline-block d-md-none ml-auto">
<action-menu data-select-variant="none" data-view-component="true" class="flex-self-start ml-auto tmp-ml-auto d-inline-block">
<focus-group direction="vertical" mnemonics retain>
<button id="gist_options-button" popovertarget="gist_options-overlay" aria-controls="gist_options-list" aria-haspopup="true" aria-labelledby="tooltip-0c250e89-a414-4d3b-9934-cefe3bde200e" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--small"> <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual">
<path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path>
</svg>
</button><tool-tip id="tooltip-0c250e89-a414-4d3b-9934-cefe3bde200e" for="gist_options-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Show Gist options</tool-tip>
<anchored-position data-target="action-menu.overlay" id="gist_options-overlay" anchor="gist_options-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true">
<div data-view-component="true" class="Overlay Overlay--size-auto">
<div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list>
<div data-view-component="true">
<ul aria-labelledby="gist_options-button" id="gist_options-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap">
<li rel="nofollow" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"DOWNLOAD_ZIP","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="99e9a473e412a892cdcd35adfda5487785d2074fe2b272bdb3c5b2405251026c" data-ga-click="Gist, download zip, location:gist overview" data-targets="action-list.items" data-item-id="download_from_gist_options" role="none" data-view-component="true" class="ActionListItem">
<a tabindex="-1" id="item-0e10191e-d973-4dc4-894d-a4999194fdcb" href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/archive/f7eaaf9844883c0e4e02fedcac37aa5450c81dc9.zip" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
<span class="ActionListItem-visual ActionListItem-visual--leading">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-download">
<path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path>
</svg>
</span>
<span data-view-component="true" class="ActionListItem-label">
Download ZIP
</span>
</a>
</li>
</ul>
</div></action-list>
</div>
</div></anchored-position> </focus-group>
</action-menu> </div>
<ul class="d-md-flex d-none pagehead-actions float-none">
<li>
<a id="gist-star-button" href="/login?return_to=https%3A%2F%2Fgist.github.com%2Fjeroenvandijk%2F5e0785f25f7fdfeac7bc7a0be72cb62a" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"gist star button","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="ae09a3d07d37a1cab4198200ee05020725d9038dfcabde60890b8b2905d9a355" aria-label="You must be signed in to star a gist" data-view-component="true" class="btn-with-count Button--secondary Button--small Button"> <span class="Button-content">
<span class="Button-visual Button-leadingVisual">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star">
<path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path>
</svg>
</span>
<span class="Button-label">Star</span>
<span class="Button-visual Button-trailingVisual">
<span class="d-flex" aria-hidden="true"><span title="0" data-view-component="true" class="Counter">0</span></span>
<span class="sr-only">(<span title="0" data-view-component="true" class="Counter">0</span>)</span>
</span>
</span>
</a><tool-tip id="tooltip-ce35df52-6cc0-47e6-8163-cb6775aea847" for="gist-star-button" popover="manual" data-direction="n" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to star a gist</tool-tip>
</li>
<li>
<a id="gist-fork-button" href="/login?return_to=https%3A%2F%2Fgist.github.com%2Fjeroenvandijk%2F5e0785f25f7fdfeac7bc7a0be72cb62a" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"gist fork button","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="aa352c062bcbd0830f3342d1374f42de42431e8da08fc13be4c830059bb50f37" aria-label="You must be signed in to fork a gist" data-view-component="true" class="btn-with-count Button--secondary Button--small Button"> <span class="Button-content">
<span class="Button-visual Button-leadingVisual">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked">
<path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path>
</svg>
</span>
<span class="Button-label">Fork</span>
<span class="Button-visual Button-trailingVisual">
<span class="d-flex" aria-hidden="true"><span title="0" data-view-component="true" class="Counter">0</span></span>
<span class="sr-only">(<span title="0" data-view-component="true" class="Counter">0</span>)</span>
</span>
</span>
</a><tool-tip id="tooltip-15e1d821-27b2-4613-bdaa-93dd675f809c" for="gist-fork-button" popover="manual" data-direction="n" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to fork a gist</tool-tip>
</li>
</ul>
</div>
<ul class="d-flex d-md-none tmp-px-3 mb-2 pagehead-actions float-none" >
<li>
<div data-view-component="true" class="flex-items-center d-inline-flex">
<select-panel data-menu-input="gist-share-url-sized-down" id="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693" anchor-align="start" anchor-side="outside-bottom" data-menu-input="gist-share-url-sized-down" data-select-variant="single" data-fetch-strategy="local" data-open-on-load="false" data-dynamic-label="true" data-view-component="true" class="flex-shrink-0">
<dialog-helper>
<button id="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-button" aria-controls="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-dialog" aria-haspopup="dialog" aria-expanded="false" type="button" data-view-component="true" class="rounded-right-0 border-right-0 Button--secondary Button--small Button"> <span class="Button-content">
<span class="Button-label">Embed</span>
</span>
<span class="Button-visual Button-trailingAction">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-triangle-down">
<path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path>
</svg>
</span>
</button>
<dialog id="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-dialog" aria-labelledby="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-dialog-title" data-target="select-panel.dialog" style="position: absolute;" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-small-portrait">
<div data-view-component="true" class="Overlay-header">
<div class="Overlay-headerContentWrap">
<div class="Overlay-titleWrap">
<h1 class="Overlay-title " id="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-dialog-title">
Select an option
</h1>
</div>
<div class="Overlay-actionWrap">
<button data-close-dialog-id="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg></button>
</div>
</div>
</div> <div data-view-component="true" class="Overlay-body p-0 tmp-p-0">
<focus-group direction="vertical" mnemonics retain>
<live-region data-target="select-panel.liveRegion"></live-region>
<div data-fetch-strategy="local" data-target="select-panel.list" data-view-component="true">
<div id="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-body">
<action-list>
<div data-view-component="true">
<ul aria-label="Select an option options" id="select-panel-dab7a517-7722-4acc-8a68-f72b0f4d0693-list" role="listbox" data-view-component="true" class="ActionListWrap p-2 tmp-p-2">
<li data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
<button value="<script src="https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js"></script>" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"EMBED","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="96fa83e642d169b52063e70ff880ea2faaacb428dd0141e7029ec085146e61d0" id="item-dcf53099-1e2f-4fc7-bc34-346a93ef5759" type="button" role="option" aria-selected="true" data-view-component="true" class="ActionListContent">
<span class="ActionListItem-visual ActionListItem-action--leading">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check ActionListItem-singleSelectCheckmark">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</span>
<span data-view-component="true" class="ActionListItem-descriptionWrap">
<span data-view-component="true" class="ActionListItem-label">
Embed
</span> <span data-view-component="true" class="ActionListItem-description">Embed this gist in your website.</span>
</span></button>
</li>
<li data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
<button value="https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"SHARE","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="01ee2e4c9322f10e925025cafb2e6994445ea633a650b1a7855c4243bd3e9c96" id="item-23a63f14-ff6f-4ece-9bdd-406f2f1f1aab" type="button" role="option" aria-selected="false" data-view-component="true" class="ActionListContent">
<span class="ActionListItem-visual ActionListItem-action--leading">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check ActionListItem-singleSelectCheckmark">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</span>
<span data-view-component="true" class="ActionListItem-descriptionWrap">
<span data-view-component="true" class="ActionListItem-label">
Share
</span> <span data-view-component="true" class="ActionListItem-description">Copy sharable link for this gist.</span>
</span></button>
</li>
<li data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
<button value="https://gist.github.com/5e0785f25f7fdfeac7bc7a0be72cb62a.git" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"USE_HTTPS","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="a7ccd004cb3b8195e5e352d5c77d397d431f285e7cd3c687bf572a706f97010d" id="item-d955bbf6-6ca4-4a1f-8672-a1c497165e0d" type="button" role="option" aria-selected="false" data-view-component="true" class="ActionListContent">
<span class="ActionListItem-visual ActionListItem-action--leading">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check ActionListItem-singleSelectCheckmark">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</span>
<span data-view-component="true" class="ActionListItem-descriptionWrap">
<span data-view-component="true" class="ActionListItem-label">
Clone via HTTPS
</span> <span data-view-component="true" class="ActionListItem-description">Clone using the web URL.</span>
</span></button>
</li>
</ul>
</div></action-list>
</div>
<div data-target="select-panel.noResults" class="SelectPanel-emptyPanel" hidden>
<h2 class="v-align-middle m-3 f5">No results found</h2>
</div>
</div> </focus-group>
</div> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <a target="_blank" rel="noopener noreferrer" href="https://docs.github.com/articles/which-remote-url-should-i-use">Learn more about clone URLs</a>
</div>
</dialog> </dialog-helper>
</select-panel> <primer-text-field class="FormControl width-full FormControl--fullWidth">
<label for="gist-share-url-sized-down" id="label-dc1a2527-7072-4e82-8e00-0c6fe48e37f9" class="sr-only FormControl-label">
Clone this repository at &lt;script src=&quot;https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js&quot;&gt;&lt;/script&gt;
</label>
<div class="FormControl-input-wrap FormControl-input-wrap--small">
<input id="gist-share-url-sized-down" aria-label="Clone this repository at &lt;script src=&quot;https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js&quot;&gt;&lt;/script&gt;" value="<script src="https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js"></script>" readonly="readonly" data-autoselect="true" data-target="primer-text-field.inputElement " aria-describedby="validation-dc1a2527-7072-4e82-8e00-0c6fe48e37f9" class="form-control FormControl-monospace FormControl-input FormControl-small rounded-left-0 rounded-right-0 border-right-0" type="text" name="gist-share-url-sized-down" />
</div>
<div class="FormControl-inlineValidation" id="validation-dc1a2527-7072-4e82-8e00-0c6fe48e37f9" hidden="hidden">
<span class="FormControl-inlineValidation--visual" data-target="primer-text-field.validationSuccessIcon" hidden><svg aria-hidden="true" data-component="Octicon" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-check-circle-fill">
<path d="M6 0a6 6 0 1 1 0 12A6 6 0 0 1 6 0Zm-.705 8.737L9.63 4.403 8.392 3.166 5.295 6.263l-1.7-1.702L2.356 5.8l2.938 2.938Z"></path>
</svg></span>
<span class=" FormControl-inlineValidation--visual" data-target="primer-text-field.validationErrorIcon"><svg aria-hidden="true" data-component="Octicon" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">
<path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>
</svg></span>
<span></span>
</div>
</primer-text-field>
<span data-view-component="true">
<clipboard-copy id="clipboard-button" aria-label="Copy" for="gist-share-url-sized-down" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"COPY_URL","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="47a92059c7db02e331e5b5bc1229fca39a72a03f7940f856cd3c2d8790b494fe" type="button" data-view-component="true" class="rounded-left-0 Button--secondary Button--small Button">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
<svg style="display: none;" aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check color-fg-success">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</clipboard-copy> <div aria-live="polite" aria-atomic="true" class="sr-only" data-clipboard-copy-feedback></div>
</span>
</div>
</li>
<li>
<button href="https://desktop.github.com" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"OPEN_IN_DESKTOP","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="2277c7bfff27ab4e647fed406d03cb7685ba62fcbd63ad3f5e73c7d62c8dc22b" data-platforms="windows,mac" id="icon-button-cb187da4-eb47-47fb-aacb-aa2f9a5a1a9d" aria-labelledby="tooltip-367013b8-6de2-46d7-83ed-1240614c48d5" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--small js-remove-unless-platform"> <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-desktop-download Button-visual">
<path d="m4.927 5.427 2.896 2.896a.25.25 0 0 0 .354 0l2.896-2.896A.25.25 0 0 0 10.896 5H8.75V.75a.75.75 0 1 0-1.5 0V5H5.104a.25.25 0 0 0-.177.427Z"></path><path d="M1.573 2.573a.25.25 0 0 0-.073.177v7.5a.25.25 0 0 0 .25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25h-3a.75.75 0 1 1 0-1.5h3A1.75 1.75 0 0 1 16 2.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.75.75 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5A1.75 1.75 0 0 1 1.75 1h3a.75.75 0 0 1 0 1.5h-3a.25.25 0 0 0-.177.073ZM6.982 12a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5H6.982Z"></path>
</svg>
</button><tool-tip id="tooltip-367013b8-6de2-46d7-83ed-1240614c48d5" for="icon-button-cb187da4-eb47-47fb-aacb-aa2f9a5a1a9d" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Save jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a to your computer and use it in GitHub Desktop.</tool-tip>
</li>
</ul>
<div class="d-flex flex-md-row flex-column px-0 tmp-pr-md-3 tmp-px-lg-5">
<div class="flex-md-order-1 flex-order-2 flex-auto">
<nav class="UnderlineNav box-shadow-none tmp-px-3 tmp-px-lg-0"
aria-label="Gist"
data-pjax="#gist-pjax-container">
<div class="UnderlineNav-body">
<a class="js-selected-navigation-item selected UnderlineNav-item" data-pjax="true" data-hotkey="g c" aria-current="page" data-selected-links="gist_code /jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a" href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon">
<path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
Code
</a>
<a class="js-selected-navigation-item UnderlineNav-item" data-pjax="true" data-hotkey="g r" data-selected-links="gist_revisions /jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/revisions" href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/revisions">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-commit UnderlineNav-octicon">
<path d="M11.93 8.5a4.002 4.002 0 0 1-7.86 0H.75a.75.75 0 0 1 0-1.5h3.32a4.002 4.002 0 0 1 7.86 0h3.32a.75.75 0 0 1 0 1.5Zm-1.43-.75a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z"></path>
</svg>
Revisions
<span title="5" data-view-component="true" class="Counter">5</span>
</a>
</div>
</nav>
</div>
<div class="d-md-flex d-none flex-items-center flex-md-order-2 flex-order-1" data-multiple>
<div data-view-component="true" class="flex-items-center d-inline-flex">
<select-panel data-menu-input="gist-share-url-original" id="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312" anchor-align="start" anchor-side="outside-bottom" data-menu-input="gist-share-url-original" data-select-variant="single" data-fetch-strategy="local" data-open-on-load="false" data-dynamic-label="true" data-view-component="true" class="flex-shrink-0">
<dialog-helper>
<button id="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-button" aria-controls="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-dialog" aria-haspopup="dialog" aria-expanded="false" type="button" data-view-component="true" class="rounded-right-0 border-right-0 Button--secondary Button--small Button"> <span class="Button-content">
<span class="Button-label">Embed</span>
</span>
<span class="Button-visual Button-trailingAction">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-triangle-down">
<path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path>
</svg>
</span>
</button>
<dialog id="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-dialog" aria-labelledby="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-dialog-title" data-target="select-panel.dialog" style="position: absolute;" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-small-portrait">
<div data-view-component="true" class="Overlay-header">
<div class="Overlay-headerContentWrap">
<div class="Overlay-titleWrap">
<h1 class="Overlay-title " id="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-dialog-title">
Select an option
</h1>
</div>
<div class="Overlay-actionWrap">
<button data-close-dialog-id="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg></button>
</div>
</div>
</div> <div data-view-component="true" class="Overlay-body p-0 tmp-p-0">
<focus-group direction="vertical" mnemonics retain>
<live-region data-target="select-panel.liveRegion"></live-region>
<div data-fetch-strategy="local" data-target="select-panel.list" data-view-component="true">
<div id="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-body">
<action-list>
<div data-view-component="true">
<ul aria-label="Select an option options" id="select-panel-a9ffeef9-100a-40bb-b696-5f177bd62312-list" role="listbox" data-view-component="true" class="ActionListWrap p-2 tmp-p-2">
<li data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
<button value="<script src="https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js"></script>" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"EMBED","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="96fa83e642d169b52063e70ff880ea2faaacb428dd0141e7029ec085146e61d0" id="item-7294aac2-c615-4bb4-b5b9-f5f32c188906" type="button" role="option" aria-selected="true" data-view-component="true" class="ActionListContent">
<span class="ActionListItem-visual ActionListItem-action--leading">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check ActionListItem-singleSelectCheckmark">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</span>
<span data-view-component="true" class="ActionListItem-descriptionWrap">
<span data-view-component="true" class="ActionListItem-label">
Embed
</span> <span data-view-component="true" class="ActionListItem-description">Embed this gist in your website.</span>
</span></button>
</li>
<li data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
<button value="https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"SHARE","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="01ee2e4c9322f10e925025cafb2e6994445ea633a650b1a7855c4243bd3e9c96" id="item-40b6ba8a-1806-4cb4-b8b1-889ca16d885e" type="button" role="option" aria-selected="false" data-view-component="true" class="ActionListContent">
<span class="ActionListItem-visual ActionListItem-action--leading">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check ActionListItem-singleSelectCheckmark">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</span>
<span data-view-component="true" class="ActionListItem-descriptionWrap">
<span data-view-component="true" class="ActionListItem-label">
Share
</span> <span data-view-component="true" class="ActionListItem-description">Copy sharable link for this gist.</span>
</span></button>
</li>
<li data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
<button value="https://gist.github.com/5e0785f25f7fdfeac7bc7a0be72cb62a.git" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"USE_HTTPS","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="a7ccd004cb3b8195e5e352d5c77d397d431f285e7cd3c687bf572a706f97010d" id="item-bbda2efe-2760-46cf-a584-2edf4f105b70" type="button" role="option" aria-selected="false" data-view-component="true" class="ActionListContent">
<span class="ActionListItem-visual ActionListItem-action--leading">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check ActionListItem-singleSelectCheckmark">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</span>
<span data-view-component="true" class="ActionListItem-descriptionWrap">
<span data-view-component="true" class="ActionListItem-label">
Clone via HTTPS
</span> <span data-view-component="true" class="ActionListItem-description">Clone using the web URL.</span>
</span></button>
</li>
</ul>
</div></action-list>
</div>
<div data-target="select-panel.noResults" class="SelectPanel-emptyPanel" hidden>
<h2 class="v-align-middle m-3 f5">No results found</h2>
</div>
</div> </focus-group>
</div> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <a target="_blank" rel="noopener noreferrer" href="https://docs.github.com/articles/which-remote-url-should-i-use">Learn more about clone URLs</a>
</div>
</dialog> </dialog-helper>
</select-panel> <primer-text-field class="FormControl width-full FormControl--fullWidth">
<label for="gist-share-url-original" id="label-486c8063-33df-4bc8-bb32-dca05ce13ef2" class="sr-only FormControl-label">
Clone this repository at &lt;script src=&quot;https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js&quot;&gt;&lt;/script&gt;
</label>
<div class="FormControl-input-wrap FormControl-input-wrap--small">
<input id="gist-share-url-original" aria-label="Clone this repository at &lt;script src=&quot;https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js&quot;&gt;&lt;/script&gt;" value="<script src="https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a.js"></script>" readonly="readonly" data-autoselect="true" data-target="primer-text-field.inputElement " aria-describedby="validation-486c8063-33df-4bc8-bb32-dca05ce13ef2" class="form-control FormControl-monospace FormControl-input FormControl-small rounded-left-0 rounded-right-0 border-right-0" type="text" name="gist-share-url-original" />
</div>
<div class="FormControl-inlineValidation" id="validation-486c8063-33df-4bc8-bb32-dca05ce13ef2" hidden="hidden">
<span class="FormControl-inlineValidation--visual" data-target="primer-text-field.validationSuccessIcon" hidden><svg aria-hidden="true" data-component="Octicon" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-check-circle-fill">
<path d="M6 0a6 6 0 1 1 0 12A6 6 0 0 1 6 0Zm-.705 8.737L9.63 4.403 8.392 3.166 5.295 6.263l-1.7-1.702L2.356 5.8l2.938 2.938Z"></path>
</svg></span>
<span class=" FormControl-inlineValidation--visual" data-target="primer-text-field.validationErrorIcon"><svg aria-hidden="true" data-component="Octicon" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">
<path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>
</svg></span>
<span></span>
</div>
</primer-text-field>
<span data-view-component="true">
<clipboard-copy id="clipboard-button" aria-label="Copy" for="gist-share-url-original" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"COPY_URL","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="47a92059c7db02e331e5b5bc1229fca39a72a03f7940f856cd3c2d8790b494fe" type="button" data-view-component="true" class="rounded-left-0 Button--secondary Button--small Button">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
<svg style="display: none;" aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check color-fg-success">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</clipboard-copy> <div aria-live="polite" aria-atomic="true" class="sr-only" data-clipboard-copy-feedback></div>
</span>
</div>
<div class="ml-2">
<button href="https://desktop.github.com" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"OPEN_IN_DESKTOP","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="2277c7bfff27ab4e647fed406d03cb7685ba62fcbd63ad3f5e73c7d62c8dc22b" data-platforms="windows,mac" id="icon-button-88985d28-f9f2-46a9-8a7e-db7550307cf0" aria-labelledby="tooltip-689f7458-64fb-412c-8a14-f58779685bee" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--small js-remove-unless-platform"> <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-desktop-download Button-visual">
<path d="m4.927 5.427 2.896 2.896a.25.25 0 0 0 .354 0l2.896-2.896A.25.25 0 0 0 10.896 5H8.75V.75a.75.75 0 1 0-1.5 0V5H5.104a.25.25 0 0 0-.177.427Z"></path><path d="M1.573 2.573a.25.25 0 0 0-.073.177v7.5a.25.25 0 0 0 .25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25h-3a.75.75 0 1 1 0-1.5h3A1.75 1.75 0 0 1 16 2.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.75.75 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5A1.75 1.75 0 0 1 1.75 1h3a.75.75 0 0 1 0 1.5h-3a.25.25 0 0 0-.177.073ZM6.982 12a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5H6.982Z"></path>
</svg>
</button><tool-tip id="tooltip-689f7458-64fb-412c-8a14-f58779685bee" for="icon-button-88985d28-f9f2-46a9-8a7e-db7550307cf0" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Save jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a to your computer and use it in GitHub Desktop.</tool-tip>
</div>
<div class="ml-2">
<a class="btn btn-sm" rel="nofollow" data-hydro-click="{"event_type":"clone_or_download.click","payload":{"feature_clicked":"DOWNLOAD_ZIP","git_repository_type":"GIST","gist_id":114259664,"originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="99e9a473e412a892cdcd35adfda5487785d2074fe2b272bdb3c5b2405251026c" data-ga-click="Gist, download zip, location:gist overview" href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/archive/f7eaaf9844883c0e4e02fedcac37aa5450c81dc9.zip">Download ZIP</a>
</div>
</div>
</div>
</div>
</div>
<div class="container-lg tmp-px-3">
<div class="repository-content gist-content" >
<div>
<div itemprop="about">
Malli composite schema that reuses the values of the underlying values during data generation
</div>
<div class="js-gist-file-update-container js-task-list-container">
<div id="file-kahn_sort-clj" class="file my-2">
<div class="file-header d-flex flex-md-items-center flex-items-start">
<div class="file-actions flex-order-2 pt-0">
<a href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/raw/f7eaaf9844883c0e4e02fedcac37aa5450c81dc9/kahn_sort.clj" data-view-component="true" class="Button--secondary Button--small Button"> <span class="Button-content">
<span class="Button-label">Raw</span>
</span>
</a>
</div>
<div class="file-info tmp-pr-4 d-flex flex-md-items-center flex-items-start flex-order-1 flex-auto">
<span class="mr-1">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square color-fg-muted">
<path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
</span>
<a class="wb-break-all" href="#file-kahn_sort-clj">
<strong class="user-select-contain gist-blob-name css-truncate-target">
kahn_sort.clj
</strong>
</a>
</div>
</div>
<div itemprop="text"
class="Box-body p-0 blob-wrapper data type-clojure gist-border-0"
style="overflow: auto" tabindex="0" role="region"
aria-label="kahn_sort.clj content, created by jeroenvandijk on 06:15PM on January 20, 2022."
>
<div class="js-check-hidden-unicode js-blob-code-container blob-code-content">
<template class="js-file-alert-template">
<div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
<span>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
<a class="Link--inTextBlock" href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
</span>
<div data-view-component="true" class="flash-action"> <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn"> Show hidden characters
</a>
</div>
</div></template>
<template class="js-line-alert-template">
<span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
</span></template>
<table data-hpc class="highlight tab-size js-file-line-container" data-tab-size="4" data-paste-markdown-skip data-tagsearch-path="kahn_sort.clj">
<tr>
<td id="file-kahn_sort-clj-L1" class="blob-num js-line-number js-blob-rnum" data-line-number="1"></td>
<td id="file-kahn_sort-clj-LC1" class="blob-code blob-code-inner js-file-line">;; Copy of https://gist.github.com/alandipert/1263783</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L2" class="blob-num js-line-number js-blob-rnum" data-line-number="2"></td>
<td id="file-kahn_sort-clj-LC2" class="blob-code blob-code-inner js-file-line">;;</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L3" class="blob-num js-line-number js-blob-rnum" data-line-number="3"></td>
<td id="file-kahn_sort-clj-LC3" class="blob-code blob-code-inner js-file-line">;; Copyright (c) Alan Dipert. All rights reserved.</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L4" class="blob-num js-line-number js-blob-rnum" data-line-number="4"></td>
<td id="file-kahn_sort-clj-LC4" class="blob-code blob-code-inner js-file-line">;; The use and distribution terms for this software are covered by the</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L5" class="blob-num js-line-number js-blob-rnum" data-line-number="5"></td>
<td id="file-kahn_sort-clj-LC5" class="blob-code blob-code-inner js-file-line">;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L6" class="blob-num js-line-number js-blob-rnum" data-line-number="6"></td>
<td id="file-kahn_sort-clj-LC6" class="blob-code blob-code-inner js-file-line">;; By using this software in any fashion, you are agreeing to be bound by</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L7" class="blob-num js-line-number js-blob-rnum" data-line-number="7"></td>
<td id="file-kahn_sort-clj-LC7" class="blob-code blob-code-inner js-file-line">;; the terms of this license.</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L8" class="blob-num js-line-number js-blob-rnum" data-line-number="8"></td>
<td id="file-kahn_sort-clj-LC8" class="blob-code blob-code-inner js-file-line">;; You must not remove this notice, or any other, from this software.</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L9" class="blob-num js-line-number js-blob-rnum" data-line-number="9"></td>
<td id="file-kahn_sort-clj-LC9" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L10" class="blob-num js-line-number js-blob-rnum" data-line-number="10"></td>
<td id="file-kahn_sort-clj-LC10" class="blob-code blob-code-inner js-file-line">(ns alandipert.kahn</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L11" class="blob-num js-line-number js-blob-rnum" data-line-number="11"></td>
<td id="file-kahn_sort-clj-LC11" class="blob-code blob-code-inner js-file-line"> (:require [clojure.set :refer [difference union intersection]]))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L12" class="blob-num js-line-number js-blob-rnum" data-line-number="12"></td>
<td id="file-kahn_sort-clj-LC12" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L13" class="blob-num js-line-number js-blob-rnum" data-line-number="13"></td>
<td id="file-kahn_sort-clj-LC13" class="blob-code blob-code-inner js-file-line">(defn without</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L14" class="blob-num js-line-number js-blob-rnum" data-line-number="14"></td>
<td id="file-kahn_sort-clj-LC14" class="blob-code blob-code-inner js-file-line"> "Returns set s with x removed."</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L15" class="blob-num js-line-number js-blob-rnum" data-line-number="15"></td>
<td id="file-kahn_sort-clj-LC15" class="blob-code blob-code-inner js-file-line"> [s x] (difference s #{x}))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L16" class="blob-num js-line-number js-blob-rnum" data-line-number="16"></td>
<td id="file-kahn_sort-clj-LC16" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L17" class="blob-num js-line-number js-blob-rnum" data-line-number="17"></td>
<td id="file-kahn_sort-clj-LC17" class="blob-code blob-code-inner js-file-line">(defn take-1</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L18" class="blob-num js-line-number js-blob-rnum" data-line-number="18"></td>
<td id="file-kahn_sort-clj-LC18" class="blob-code blob-code-inner js-file-line"> "Returns the pair [element, s'] where s' is set s with element removed."</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L19" class="blob-num js-line-number js-blob-rnum" data-line-number="19"></td>
<td id="file-kahn_sort-clj-LC19" class="blob-code blob-code-inner js-file-line"> [s] {:pre [(not (empty? s))]}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L20" class="blob-num js-line-number js-blob-rnum" data-line-number="20"></td>
<td id="file-kahn_sort-clj-LC20" class="blob-code blob-code-inner js-file-line"> (let [item (first s)]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L21" class="blob-num js-line-number js-blob-rnum" data-line-number="21"></td>
<td id="file-kahn_sort-clj-LC21" class="blob-code blob-code-inner js-file-line"> [item (without s item)]))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L22" class="blob-num js-line-number js-blob-rnum" data-line-number="22"></td>
<td id="file-kahn_sort-clj-LC22" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L23" class="blob-num js-line-number js-blob-rnum" data-line-number="23"></td>
<td id="file-kahn_sort-clj-LC23" class="blob-code blob-code-inner js-file-line">(defn no-incoming</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L24" class="blob-num js-line-number js-blob-rnum" data-line-number="24"></td>
<td id="file-kahn_sort-clj-LC24" class="blob-code blob-code-inner js-file-line"> "Returns the set of nodes in graph g for which there are no incoming</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L25" class="blob-num js-line-number js-blob-rnum" data-line-number="25"></td>
<td id="file-kahn_sort-clj-LC25" class="blob-code blob-code-inner js-file-line"> edges, where g is a map of nodes to sets of nodes."</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L26" class="blob-num js-line-number js-blob-rnum" data-line-number="26"></td>
<td id="file-kahn_sort-clj-LC26" class="blob-code blob-code-inner js-file-line"> [g]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L27" class="blob-num js-line-number js-blob-rnum" data-line-number="27"></td>
<td id="file-kahn_sort-clj-LC27" class="blob-code blob-code-inner js-file-line"> (let [nodes (set (keys g))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L28" class="blob-num js-line-number js-blob-rnum" data-line-number="28"></td>
<td id="file-kahn_sort-clj-LC28" class="blob-code blob-code-inner js-file-line"> have-incoming (apply union (vals g))]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L29" class="blob-num js-line-number js-blob-rnum" data-line-number="29"></td>
<td id="file-kahn_sort-clj-LC29" class="blob-code blob-code-inner js-file-line"> (difference nodes have-incoming)))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L30" class="blob-num js-line-number js-blob-rnum" data-line-number="30"></td>
<td id="file-kahn_sort-clj-LC30" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L31" class="blob-num js-line-number js-blob-rnum" data-line-number="31"></td>
<td id="file-kahn_sort-clj-LC31" class="blob-code blob-code-inner js-file-line">(defn normalize</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L32" class="blob-num js-line-number js-blob-rnum" data-line-number="32"></td>
<td id="file-kahn_sort-clj-LC32" class="blob-code blob-code-inner js-file-line"> "Returns g with empty outgoing edges added for nodes with incoming</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L33" class="blob-num js-line-number js-blob-rnum" data-line-number="33"></td>
<td id="file-kahn_sort-clj-LC33" class="blob-code blob-code-inner js-file-line"> edges only. Example: {:a #{:b}} => {:a #{:b}, :b #{}}"</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L34" class="blob-num js-line-number js-blob-rnum" data-line-number="34"></td>
<td id="file-kahn_sort-clj-LC34" class="blob-code blob-code-inner js-file-line"> [g]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L35" class="blob-num js-line-number js-blob-rnum" data-line-number="35"></td>
<td id="file-kahn_sort-clj-LC35" class="blob-code blob-code-inner js-file-line"> (let [have-incoming (apply union (vals g))]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L36" class="blob-num js-line-number js-blob-rnum" data-line-number="36"></td>
<td id="file-kahn_sort-clj-LC36" class="blob-code blob-code-inner js-file-line"> (reduce #(if (get % %2) % (assoc % %2 #{})) g have-incoming)))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L37" class="blob-num js-line-number js-blob-rnum" data-line-number="37"></td>
<td id="file-kahn_sort-clj-LC37" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L38" class="blob-num js-line-number js-blob-rnum" data-line-number="38"></td>
<td id="file-kahn_sort-clj-LC38" class="blob-code blob-code-inner js-file-line">(defn kahn-sort</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L39" class="blob-num js-line-number js-blob-rnum" data-line-number="39"></td>
<td id="file-kahn_sort-clj-LC39" class="blob-code blob-code-inner js-file-line"> "Proposes a topological sort for directed graph g using Kahn's</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L40" class="blob-num js-line-number js-blob-rnum" data-line-number="40"></td>
<td id="file-kahn_sort-clj-LC40" class="blob-code blob-code-inner js-file-line"> algorithm, where g is a map of nodes to sets of nodes. If g is</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L41" class="blob-num js-line-number js-blob-rnum" data-line-number="41"></td>
<td id="file-kahn_sort-clj-LC41" class="blob-code blob-code-inner js-file-line"> cyclic, returns nil."</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L42" class="blob-num js-line-number js-blob-rnum" data-line-number="42"></td>
<td id="file-kahn_sort-clj-LC42" class="blob-code blob-code-inner js-file-line"> ([g]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L43" class="blob-num js-line-number js-blob-rnum" data-line-number="43"></td>
<td id="file-kahn_sort-clj-LC43" class="blob-code blob-code-inner js-file-line"> (kahn-sort (normalize g) [] (no-incoming g)))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L44" class="blob-num js-line-number js-blob-rnum" data-line-number="44"></td>
<td id="file-kahn_sort-clj-LC44" class="blob-code blob-code-inner js-file-line"> ([g l s]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L45" class="blob-num js-line-number js-blob-rnum" data-line-number="45"></td>
<td id="file-kahn_sort-clj-LC45" class="blob-code blob-code-inner js-file-line"> (if (empty? s)</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L46" class="blob-num js-line-number js-blob-rnum" data-line-number="46"></td>
<td id="file-kahn_sort-clj-LC46" class="blob-code blob-code-inner js-file-line"> (when (every? empty? (vals g)) l)</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L47" class="blob-num js-line-number js-blob-rnum" data-line-number="47"></td>
<td id="file-kahn_sort-clj-LC47" class="blob-code blob-code-inner js-file-line"> (let [[n s'] (take-1 s)</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L48" class="blob-num js-line-number js-blob-rnum" data-line-number="48"></td>
<td id="file-kahn_sort-clj-LC48" class="blob-code blob-code-inner js-file-line"> m (g n)</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L49" class="blob-num js-line-number js-blob-rnum" data-line-number="49"></td>
<td id="file-kahn_sort-clj-LC49" class="blob-code blob-code-inner js-file-line"> g' (reduce #(update-in % [n] without %2) g m)]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L50" class="blob-num js-line-number js-blob-rnum" data-line-number="50"></td>
<td id="file-kahn_sort-clj-LC50" class="blob-code blob-code-inner js-file-line"> (recur g' (conj l n) (union s' (intersection (no-incoming g') m)))))))</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L51" class="blob-num js-line-number js-blob-rnum" data-line-number="51"></td>
<td id="file-kahn_sort-clj-LC51" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L52" class="blob-num js-line-number js-blob-rnum" data-line-number="52"></td>
<td id="file-kahn_sort-clj-LC52" class="blob-code blob-code-inner js-file-line">(comment</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L53" class="blob-num js-line-number js-blob-rnum" data-line-number="53"></td>
<td id="file-kahn_sort-clj-LC53" class="blob-code blob-code-inner js-file-line"> (def acyclic-g</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L54" class="blob-num js-line-number js-blob-rnum" data-line-number="54"></td>
<td id="file-kahn_sort-clj-LC54" class="blob-code blob-code-inner js-file-line"> {7 #{11 8}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L55" class="blob-num js-line-number js-blob-rnum" data-line-number="55"></td>
<td id="file-kahn_sort-clj-LC55" class="blob-code blob-code-inner js-file-line"> 5 #{11}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L56" class="blob-num js-line-number js-blob-rnum" data-line-number="56"></td>
<td id="file-kahn_sort-clj-LC56" class="blob-code blob-code-inner js-file-line"> 3 #{8 10}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L57" class="blob-num js-line-number js-blob-rnum" data-line-number="57"></td>
<td id="file-kahn_sort-clj-LC57" class="blob-code blob-code-inner js-file-line"> 11 #{2 9}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L58" class="blob-num js-line-number js-blob-rnum" data-line-number="58"></td>
<td id="file-kahn_sort-clj-LC58" class="blob-code blob-code-inner js-file-line"> 8 #{9}})</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L59" class="blob-num js-line-number js-blob-rnum" data-line-number="59"></td>
<td id="file-kahn_sort-clj-LC59" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L60" class="blob-num js-line-number js-blob-rnum" data-line-number="60"></td>
<td id="file-kahn_sort-clj-LC60" class="blob-code blob-code-inner js-file-line"> (def cyclic-g</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L61" class="blob-num js-line-number js-blob-rnum" data-line-number="61"></td>
<td id="file-kahn_sort-clj-LC61" class="blob-code blob-code-inner js-file-line"> {7 #{11 8}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L62" class="blob-num js-line-number js-blob-rnum" data-line-number="62"></td>
<td id="file-kahn_sort-clj-LC62" class="blob-code blob-code-inner js-file-line"> 5 #{11}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L63" class="blob-num js-line-number js-blob-rnum" data-line-number="63"></td>
<td id="file-kahn_sort-clj-LC63" class="blob-code blob-code-inner js-file-line"> 3 #{8 10}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L64" class="blob-num js-line-number js-blob-rnum" data-line-number="64"></td>
<td id="file-kahn_sort-clj-LC64" class="blob-code blob-code-inner js-file-line"> 11 #{2 9}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L65" class="blob-num js-line-number js-blob-rnum" data-line-number="65"></td>
<td id="file-kahn_sort-clj-LC65" class="blob-code blob-code-inner js-file-line"> 8 #{9}</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L66" class="blob-num js-line-number js-blob-rnum" data-line-number="66"></td>
<td id="file-kahn_sort-clj-LC66" class="blob-code blob-code-inner js-file-line"> 2 #{11}}) ;oops, a cycle!</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L67" class="blob-num js-line-number js-blob-rnum" data-line-number="67"></td>
<td id="file-kahn_sort-clj-LC67" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L68" class="blob-num js-line-number js-blob-rnum" data-line-number="68"></td>
<td id="file-kahn_sort-clj-LC68" class="blob-code blob-code-inner js-file-line"> (kahn-sort acyclic-g) ;=> [3 5 7 8 10 11 2 9]</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L69" class="blob-num js-line-number js-blob-rnum" data-line-number="69"></td>
<td id="file-kahn_sort-clj-LC69" class="blob-code blob-code-inner js-file-line"> (kahn-sort cyclic-g) ;=> nil</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L70" class="blob-num js-line-number js-blob-rnum" data-line-number="70"></td>
<td id="file-kahn_sort-clj-LC70" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-kahn_sort-clj-L71" class="blob-num js-line-number js-blob-rnum" data-line-number="71"></td>
<td id="file-kahn_sort-clj-LC71" class="blob-code blob-code-inner js-file-line"> )</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="js-gist-file-update-container js-task-list-container">
<div id="file-malli_composite-clj" class="file my-2">
<div class="file-header d-flex flex-md-items-center flex-items-start">
<div class="file-actions flex-order-2 pt-0">
<a href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/raw/f7eaaf9844883c0e4e02fedcac37aa5450c81dc9/malli_composite.clj" data-view-component="true" class="Button--secondary Button--small Button"> <span class="Button-content">
<span class="Button-label">Raw</span>
</span>
</a>
</div>
<div class="file-info tmp-pr-4 d-flex flex-md-items-center flex-items-start flex-order-1 flex-auto">
<span class="mr-1">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square color-fg-muted">
<path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
</span>
<a class="wb-break-all" href="#file-malli_composite-clj">
<strong class="user-select-contain gist-blob-name css-truncate-target">
malli_composite.clj
</strong>
</a>
</div>
</div>
<div itemprop="text"
class="Box-body p-0 blob-wrapper data type-clojure gist-border-0"
style="overflow: auto" tabindex="0" role="region"
aria-label="malli_composite.clj content, created by jeroenvandijk on 06:15PM on January 20, 2022."
>
<div class="js-check-hidden-unicode js-blob-code-container blob-code-content">
<template class="js-file-alert-template">
<div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
<span>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
<a class="Link--inTextBlock" href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
</span>
<div data-view-component="true" class="flash-action"> <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn"> Show hidden characters
</a>
</div>
</div></template>
<template class="js-line-alert-template">
<span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
</span></template>
<table data-hpc class="highlight tab-size js-file-line-container" data-tab-size="4" data-paste-markdown-skip data-tagsearch-path="malli_composite.clj">
<tr>
<td id="file-malli_composite-clj-L1" class="blob-num js-line-number js-blob-rnum" data-line-number="1"></td>
<td id="file-malli_composite-clj-LC1" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L2" class="blob-num js-line-number js-blob-rnum" data-line-number="2"></td>
<td id="file-malli_composite-clj-LC2" class="blob-code blob-code-inner js-file-line">(ns malli.composite</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L3" class="blob-num js-line-number js-blob-rnum" data-line-number="3"></td>
<td id="file-malli_composite-clj-LC3" class="blob-code blob-code-inner js-file-line"> (:require</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L4" class="blob-num js-line-number js-blob-rnum" data-line-number="4"></td>
<td id="file-malli_composite-clj-LC4" class="blob-code blob-code-inner js-file-line"> [clojure.test.check.generators :as gen]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L5" class="blob-num js-line-number js-blob-rnum" data-line-number="5"></td>
<td id="file-malli_composite-clj-LC5" class="blob-code blob-code-inner js-file-line"> [malli.core :as m]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L6" class="blob-num js-line-number js-blob-rnum" data-line-number="6"></td>
<td id="file-malli_composite-clj-LC6" class="blob-code blob-code-inner js-file-line"> [malli.generator :as mg]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L7" class="blob-num js-line-number js-blob-rnum" data-line-number="7"></td>
<td id="file-malli_composite-clj-LC7" class="blob-code blob-code-inner js-file-line"> [malli.util :as mu]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L8" class="blob-num js-line-number js-blob-rnum" data-line-number="8"></td>
<td id="file-malli_composite-clj-LC8" class="blob-code blob-code-inner js-file-line"> [malli.registry :as mr]))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L9" class="blob-num js-line-number js-blob-rnum" data-line-number="9"></td>
<td id="file-malli_composite-clj-LC9" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L10" class="blob-num js-line-number js-blob-rnum" data-line-number="10"></td>
<td id="file-malli_composite-clj-LC10" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L11" class="blob-num js-line-number js-blob-rnum" data-line-number="11"></td>
<td id="file-malli_composite-clj-LC11" class="blob-code blob-code-inner js-file-line">(def *registry</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L12" class="blob-num js-line-number js-blob-rnum" data-line-number="12"></td>
<td id="file-malli_composite-clj-LC12" class="blob-code blob-code-inner js-file-line"> (atom</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L13" class="blob-num js-line-number js-blob-rnum" data-line-number="13"></td>
<td id="file-malli_composite-clj-LC13" class="blob-code blob-code-inner js-file-line"> (merge</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L14" class="blob-num js-line-number js-blob-rnum" data-line-number="14"></td>
<td id="file-malli_composite-clj-LC14" class="blob-code blob-code-inner js-file-line"> (m/default-schemas)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L15" class="blob-num js-line-number js-blob-rnum" data-line-number="15"></td>
<td id="file-malli_composite-clj-LC15" class="blob-code blob-code-inner js-file-line"> (mu/schemas))))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L16" class="blob-num js-line-number js-blob-rnum" data-line-number="16"></td>
<td id="file-malli_composite-clj-LC16" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L17" class="blob-num js-line-number js-blob-rnum" data-line-number="17"></td>
<td id="file-malli_composite-clj-LC17" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L18" class="blob-num js-line-number js-blob-rnum" data-line-number="18"></td>
<td id="file-malli_composite-clj-LC18" class="blob-code blob-code-inner js-file-line">(def registry (mr/mutable-registry *registry))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L19" class="blob-num js-line-number js-blob-rnum" data-line-number="19"></td>
<td id="file-malli_composite-clj-LC19" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L20" class="blob-num js-line-number js-blob-rnum" data-line-number="20"></td>
<td id="file-malli_composite-clj-LC20" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L21" class="blob-num js-line-number js-blob-rnum" data-line-number="21"></td>
<td id="file-malli_composite-clj-LC21" class="blob-code blob-code-inner js-file-line">(defn register! [type ?schema]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L22" class="blob-num js-line-number js-blob-rnum" data-line-number="22"></td>
<td id="file-malli_composite-clj-LC22" class="blob-code blob-code-inner js-file-line"> (swap! *registry assoc type ?schema)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L23" class="blob-num js-line-number js-blob-rnum" data-line-number="23"></td>
<td id="file-malli_composite-clj-LC23" class="blob-code blob-code-inner js-file-line"> :ok)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L24" class="blob-num js-line-number js-blob-rnum" data-line-number="24"></td>
<td id="file-malli_composite-clj-LC24" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L25" class="blob-num js-line-number js-blob-rnum" data-line-number="25"></td>
<td id="file-malli_composite-clj-LC25" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L26" class="blob-num js-line-number js-blob-rnum" data-line-number="26"></td>
<td id="file-malli_composite-clj-LC26" class="blob-code blob-code-inner js-file-line">(defn generator [k]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L27" class="blob-num js-line-number js-blob-rnum" data-line-number="27"></td>
<td id="file-malli_composite-clj-LC27" class="blob-code blob-code-inner js-file-line"> (mg/generator (m/schema k {:registry registry})))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L28" class="blob-num js-line-number js-blob-rnum" data-line-number="28"></td>
<td id="file-malli_composite-clj-LC28" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L29" class="blob-num js-line-number js-blob-rnum" data-line-number="29"></td>
<td id="file-malli_composite-clj-LC29" class="blob-code blob-code-inner js-file-line">(defn generate [k]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L30" class="blob-num js-line-number js-blob-rnum" data-line-number="30"></td>
<td id="file-malli_composite-clj-LC30" class="blob-code blob-code-inner js-file-line"> (mg/generate (m/schema k {:registry registry})))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L31" class="blob-num js-line-number js-blob-rnum" data-line-number="31"></td>
<td id="file-malli_composite-clj-LC31" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L32" class="blob-num js-line-number js-blob-rnum" data-line-number="32"></td>
<td id="file-malli_composite-clj-LC32" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L33" class="blob-num js-line-number js-blob-rnum" data-line-number="33"></td>
<td id="file-malli_composite-clj-LC33" class="blob-code blob-code-inner js-file-line">(defn k->props [k]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L34" class="blob-num js-line-number js-blob-rnum" data-line-number="34"></td>
<td id="file-malli_composite-clj-LC34" class="blob-code blob-code-inner js-file-line"> (m/properties (m/deref (m/schema k {:registry registry}))))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L35" class="blob-num js-line-number js-blob-rnum" data-line-number="35"></td>
<td id="file-malli_composite-clj-LC35" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L36" class="blob-num js-line-number js-blob-rnum" data-line-number="36"></td>
<td id="file-malli_composite-clj-LC36" class="blob-code blob-code-inner js-file-line">;; Base types</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L37" class="blob-num js-line-number js-blob-rnum" data-line-number="37"></td>
<td id="file-malli_composite-clj-LC37" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L38" class="blob-num js-line-number js-blob-rnum" data-line-number="38"></td>
<td id="file-malli_composite-clj-LC38" class="blob-code blob-code-inner js-file-line">(register! :composite</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L39" class="blob-num js-line-number js-blob-rnum" data-line-number="39"></td>
<td id="file-malli_composite-clj-LC39" class="blob-code blob-code-inner js-file-line"> (m/-simple-schema</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L40" class="blob-num js-line-number js-blob-rnum" data-line-number="40"></td>
<td id="file-malli_composite-clj-LC40" class="blob-code blob-code-inner js-file-line"> (fn [{:keys [schema fields compose]} _]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L41" class="blob-num js-line-number js-blob-rnum" data-line-number="41"></td>
<td id="file-malli_composite-clj-LC41" class="blob-code blob-code-inner js-file-line"> (assert (and schema fields compose))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L42" class="blob-num js-line-number js-blob-rnum" data-line-number="42"></td>
<td id="file-malli_composite-clj-LC42" class="blob-code blob-code-inner js-file-line"> {:type ::composite</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L43" class="blob-num js-line-number js-blob-rnum" data-line-number="43"></td>
<td id="file-malli_composite-clj-LC43" class="blob-code blob-code-inner js-file-line"> :pred (m/validator schema)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L44" class="blob-num js-line-number js-blob-rnum" data-line-number="44"></td>
<td id="file-malli_composite-clj-LC44" class="blob-code blob-code-inner js-file-line"> ;; generator without context</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L45" class="blob-num js-line-number js-blob-rnum" data-line-number="45"></td>
<td id="file-malli_composite-clj-LC45" class="blob-code blob-code-inner js-file-line"> :type-properties {:fields fields</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L46" class="blob-num js-line-number js-blob-rnum" data-line-number="46"></td>
<td id="file-malli_composite-clj-LC46" class="blob-code blob-code-inner js-file-line"> :compose compose</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L47" class="blob-num js-line-number js-blob-rnum" data-line-number="47"></td>
<td id="file-malli_composite-clj-LC47" class="blob-code blob-code-inner js-file-line"> :gen/gen</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L48" class="blob-num js-line-number js-blob-rnum" data-line-number="48"></td>
<td id="file-malli_composite-clj-LC48" class="blob-code blob-code-inner js-file-line"> (gen/fmap (partial apply compose)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L49" class="blob-num js-line-number js-blob-rnum" data-line-number="49"></td>
<td id="file-malli_composite-clj-LC49" class="blob-code blob-code-inner js-file-line"> (apply gen/tuple (map generator fields)))}})))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L50" class="blob-num js-line-number js-blob-rnum" data-line-number="50"></td>
<td id="file-malli_composite-clj-LC50" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L51" class="blob-num js-line-number js-blob-rnum" data-line-number="51"></td>
<td id="file-malli_composite-clj-LC51" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L52" class="blob-num js-line-number js-blob-rnum" data-line-number="52"></td>
<td id="file-malli_composite-clj-LC52" class="blob-code blob-code-inner js-file-line">(defn composite-fields [k]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L53" class="blob-num js-line-number js-blob-rnum" data-line-number="53"></td>
<td id="file-malli_composite-clj-LC53" class="blob-code blob-code-inner js-file-line"> (set (:fields (k->props k))))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L54" class="blob-num js-line-number js-blob-rnum" data-line-number="54"></td>
<td id="file-malli_composite-clj-LC54" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L55" class="blob-num js-line-number js-blob-rnum" data-line-number="55"></td>
<td id="file-malli_composite-clj-LC55" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L56" class="blob-num js-line-number js-blob-rnum" data-line-number="56"></td>
<td id="file-malli_composite-clj-LC56" class="blob-code blob-code-inner js-file-line">(defn fields->tree [fields]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L57" class="blob-num js-line-number js-blob-rnum" data-line-number="57"></td>
<td id="file-malli_composite-clj-LC57" class="blob-code blob-code-inner js-file-line"> (loop [tree {}</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L58" class="blob-num js-line-number js-blob-rnum" data-line-number="58"></td>
<td id="file-malli_composite-clj-LC58" class="blob-code blob-code-inner js-file-line"> visited #{}</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L59" class="blob-num js-line-number js-blob-rnum" data-line-number="59"></td>
<td id="file-malli_composite-clj-LC59" class="blob-code blob-code-inner js-file-line"> [field & left] fields]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L60" class="blob-num js-line-number js-blob-rnum" data-line-number="60"></td>
<td id="file-malli_composite-clj-LC60" class="blob-code blob-code-inner js-file-line"> (if field</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L61" class="blob-num js-line-number js-blob-rnum" data-line-number="61"></td>
<td id="file-malli_composite-clj-LC61" class="blob-code blob-code-inner js-file-line"> (if (contains? visited field)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L62" class="blob-num js-line-number js-blob-rnum" data-line-number="62"></td>
<td id="file-malli_composite-clj-LC62" class="blob-code blob-code-inner js-file-line"> (recur tree visited left)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L63" class="blob-num js-line-number js-blob-rnum" data-line-number="63"></td>
<td id="file-malli_composite-clj-LC63" class="blob-code blob-code-inner js-file-line"> (let [deps (composite-fields field)]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L64" class="blob-num js-line-number js-blob-rnum" data-line-number="64"></td>
<td id="file-malli_composite-clj-LC64" class="blob-code blob-code-inner js-file-line"> (recur (assoc tree field (set deps))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L65" class="blob-num js-line-number js-blob-rnum" data-line-number="65"></td>
<td id="file-malli_composite-clj-LC65" class="blob-code blob-code-inner js-file-line"> (conj visited field)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L66" class="blob-num js-line-number js-blob-rnum" data-line-number="66"></td>
<td id="file-malli_composite-clj-LC66" class="blob-code blob-code-inner js-file-line"> (concat left deps))))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L67" class="blob-num js-line-number js-blob-rnum" data-line-number="67"></td>
<td id="file-malli_composite-clj-LC67" class="blob-code blob-code-inner js-file-line"> tree)))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L68" class="blob-num js-line-number js-blob-rnum" data-line-number="68"></td>
<td id="file-malli_composite-clj-LC68" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L69" class="blob-num js-line-number js-blob-rnum" data-line-number="69"></td>
<td id="file-malli_composite-clj-LC69" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L70" class="blob-num js-line-number js-blob-rnum" data-line-number="70"></td>
<td id="file-malli_composite-clj-LC70" class="blob-code blob-code-inner js-file-line">(defn topo-sort [tree]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L71" class="blob-num js-line-number js-blob-rnum" data-line-number="71"></td>
<td id="file-malli_composite-clj-LC71" class="blob-code blob-code-inner js-file-line"> (reverse (alandipert.kahn/kahn-sort tree)))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L72" class="blob-num js-line-number js-blob-rnum" data-line-number="72"></td>
<td id="file-malli_composite-clj-LC72" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L73" class="blob-num js-line-number js-blob-rnum" data-line-number="73"></td>
<td id="file-malli_composite-clj-LC73" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L74" class="blob-num js-line-number js-blob-rnum" data-line-number="74"></td>
<td id="file-malli_composite-clj-LC74" class="blob-code blob-code-inner js-file-line">(defn ks->compose-fns [ks]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L75" class="blob-num js-line-number js-blob-rnum" data-line-number="75"></td>
<td id="file-malli_composite-clj-LC75" class="blob-code blob-code-inner js-file-line"> (zipmap ks (map (comp :compose k->props) ks)))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L76" class="blob-num js-line-number js-blob-rnum" data-line-number="76"></td>
<td id="file-malli_composite-clj-LC76" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L77" class="blob-num js-line-number js-blob-rnum" data-line-number="77"></td>
<td id="file-malli_composite-clj-LC77" class="blob-code blob-code-inner js-file-line">(defn getx [m k]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L78" class="blob-num js-line-number js-blob-rnum" data-line-number="78"></td>
<td id="file-malli_composite-clj-LC78" class="blob-code blob-code-inner js-file-line"> (let [v (get m k ::sentinel)]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L79" class="blob-num js-line-number js-blob-rnum" data-line-number="79"></td>
<td id="file-malli_composite-clj-LC79" class="blob-code blob-code-inner js-file-line"> (if (= v ::sentinel)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L80" class="blob-num js-line-number js-blob-rnum" data-line-number="80"></td>
<td id="file-malli_composite-clj-LC80" class="blob-code blob-code-inner js-file-line"> (throw (ex-info "Missing key" {:k k :ks (keys m)}))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L81" class="blob-num js-line-number js-blob-rnum" data-line-number="81"></td>
<td id="file-malli_composite-clj-LC81" class="blob-code blob-code-inner js-file-line"> v)))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L82" class="blob-num js-line-number js-blob-rnum" data-line-number="82"></td>
<td id="file-malli_composite-clj-LC82" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L83" class="blob-num js-line-number js-blob-rnum" data-line-number="83"></td>
<td id="file-malli_composite-clj-LC83" class="blob-code blob-code-inner js-file-line">(defn entity-fields->generator [entity-fields]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L84" class="blob-num js-line-number js-blob-rnum" data-line-number="84"></td>
<td id="file-malli_composite-clj-LC84" class="blob-code blob-code-inner js-file-line"> (let [tree (fields->tree entity-fields)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L85" class="blob-num js-line-number js-blob-rnum" data-line-number="85"></td>
<td id="file-malli_composite-clj-LC85" class="blob-code blob-code-inner js-file-line"> order (topo-sort tree)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L86" class="blob-num js-line-number js-blob-rnum" data-line-number="86"></td>
<td id="file-malli_composite-clj-LC86" class="blob-code blob-code-inner js-file-line"> no-deps (keys (filter (comp empty? val) tree))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L87" class="blob-num js-line-number js-blob-rnum" data-line-number="87"></td>
<td id="file-malli_composite-clj-LC87" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L88" class="blob-num js-line-number js-blob-rnum" data-line-number="88"></td>
<td id="file-malli_composite-clj-LC88" class="blob-code blob-code-inner js-file-line"> entity-gen (apply gen/hash-map (mapcat (fn [k] [k (generator k)]) no-deps))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L89" class="blob-num js-line-number js-blob-rnum" data-line-number="89"></td>
<td id="file-malli_composite-clj-LC89" class="blob-code blob-code-inner js-file-line"> deps-order (remove (set no-deps) order)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L90" class="blob-num js-line-number js-blob-rnum" data-line-number="90"></td>
<td id="file-malli_composite-clj-LC90" class="blob-code blob-code-inner js-file-line"> compose-fns (ks->compose-fns deps-order)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L91" class="blob-num js-line-number js-blob-rnum" data-line-number="91"></td>
<td id="file-malli_composite-clj-LC91" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L92" class="blob-num js-line-number js-blob-rnum" data-line-number="92"></td>
<td id="file-malli_composite-clj-LC92" class="blob-code blob-code-inner js-file-line"> entity-gen (reduce (fn [entity-gen field]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L93" class="blob-num js-line-number js-blob-rnum" data-line-number="93"></td>
<td id="file-malli_composite-clj-LC93" class="blob-code blob-code-inner js-file-line"> (gen/bind entity-gen</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L94" class="blob-num js-line-number js-blob-rnum" data-line-number="94"></td>
<td id="file-malli_composite-clj-LC94" class="blob-code blob-code-inner js-file-line"> (let [compose (get compose-fns field)]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L95" class="blob-num js-line-number js-blob-rnum" data-line-number="95"></td>
<td id="file-malli_composite-clj-LC95" class="blob-code blob-code-inner js-file-line"> (fn [entity]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L96" class="blob-num js-line-number js-blob-rnum" data-line-number="96"></td>
<td id="file-malli_composite-clj-LC96" class="blob-code blob-code-inner js-file-line"> (let [d (getx tree field)]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L97" class="blob-num js-line-number js-blob-rnum" data-line-number="97"></td>
<td id="file-malli_composite-clj-LC97" class="blob-code blob-code-inner js-file-line"> (gen/return</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L98" class="blob-num js-line-number js-blob-rnum" data-line-number="98"></td>
<td id="file-malli_composite-clj-LC98" class="blob-code blob-code-inner js-file-line"> (assoc entity field</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L99" class="blob-num js-line-number js-blob-rnum" data-line-number="99"></td>
<td id="file-malli_composite-clj-LC99" class="blob-code blob-code-inner js-file-line"> ; (pr-str d)</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L100" class="blob-num js-line-number js-blob-rnum" data-line-number="100"></td>
<td id="file-malli_composite-clj-LC100" class="blob-code blob-code-inner js-file-line"> (apply compose (map (partial get entity) d)))))))))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L101" class="blob-num js-line-number js-blob-rnum" data-line-number="101"></td>
<td id="file-malli_composite-clj-LC101" class="blob-code blob-code-inner js-file-line"> entity-gen</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L102" class="blob-num js-line-number js-blob-rnum" data-line-number="102"></td>
<td id="file-malli_composite-clj-LC102" class="blob-code blob-code-inner js-file-line"> deps-order)]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L103" class="blob-num js-line-number js-blob-rnum" data-line-number="103"></td>
<td id="file-malli_composite-clj-LC103" class="blob-code blob-code-inner js-file-line"> (gen/fmap (fn [entity]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L104" class="blob-num js-line-number js-blob-rnum" data-line-number="104"></td>
<td id="file-malli_composite-clj-LC104" class="blob-code blob-code-inner js-file-line"> (select-keys entity entity-fields))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L105" class="blob-num js-line-number js-blob-rnum" data-line-number="105"></td>
<td id="file-malli_composite-clj-LC105" class="blob-code blob-code-inner js-file-line"> entity-gen)))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L106" class="blob-num js-line-number js-blob-rnum" data-line-number="106"></td>
<td id="file-malli_composite-clj-LC106" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L107" class="blob-num js-line-number js-blob-rnum" data-line-number="107"></td>
<td id="file-malli_composite-clj-LC107" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L108" class="blob-num js-line-number js-blob-rnum" data-line-number="108"></td>
<td id="file-malli_composite-clj-LC108" class="blob-code blob-code-inner js-file-line">(defn register-entity! [type fields]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L109" class="blob-num js-line-number js-blob-rnum" data-line-number="109"></td>
<td id="file-malli_composite-clj-LC109" class="blob-code blob-code-inner js-file-line"> (let [registry @*registry</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L110" class="blob-num js-line-number js-blob-rnum" data-line-number="110"></td>
<td id="file-malli_composite-clj-LC110" class="blob-code blob-code-inner js-file-line"> schema (into [:map {:gen/gen (entity-fields->generator fields)}]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L111" class="blob-num js-line-number js-blob-rnum" data-line-number="111"></td>
<td id="file-malli_composite-clj-LC111" class="blob-code blob-code-inner js-file-line"> fields)]</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L112" class="blob-num js-line-number js-blob-rnum" data-line-number="112"></td>
<td id="file-malli_composite-clj-LC112" class="blob-code blob-code-inner js-file-line"> (register! type schema)))</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L113" class="blob-num js-line-number js-blob-rnum" data-line-number="113"></td>
<td id="file-malli_composite-clj-LC113" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L114" class="blob-num js-line-number js-blob-rnum" data-line-number="114"></td>
<td id="file-malli_composite-clj-LC114" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L115" class="blob-num js-line-number js-blob-rnum" data-line-number="115"></td>
<td id="file-malli_composite-clj-LC115" class="blob-code blob-code-inner js-file-line">(comment</td>
</tr>
<tr>
<td id="file-malli_composite-clj-L116" class="blob-num js-line-number js-blob-rnum" data-line-number="116"></td>
<td id="file-malli_composite-clj-LC116" class="blob-code blob-code-inner js-file-line"> (topo-sort (fields->tree [:user/name :email/address])))</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="js-gist-file-update-container js-task-list-container">
<div id="file-malli_composite_test-clj" class="file my-2">
<div class="file-header d-flex flex-md-items-center flex-items-start">
<div class="file-actions flex-order-2 pt-0">
<a href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/raw/f7eaaf9844883c0e4e02fedcac37aa5450c81dc9/malli_composite_test.clj" data-view-component="true" class="Button--secondary Button--small Button"> <span class="Button-content">
<span class="Button-label">Raw</span>
</span>
</a>
</div>
<div class="file-info tmp-pr-4 d-flex flex-md-items-center flex-items-start flex-order-1 flex-auto">
<span class="mr-1">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square color-fg-muted">
<path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
</span>
<a class="wb-break-all" href="#file-malli_composite_test-clj">
<strong class="user-select-contain gist-blob-name css-truncate-target">
malli_composite_test.clj
</strong>
</a>
</div>
</div>
<div itemprop="text"
class="Box-body p-0 blob-wrapper data type-clojure gist-border-0"
style="overflow: auto" tabindex="0" role="region"
aria-label="malli_composite_test.clj content, created by jeroenvandijk on 06:15PM on January 20, 2022."
>
<div class="js-check-hidden-unicode js-blob-code-container blob-code-content">
<template class="js-file-alert-template">
<div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
<span>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
<a class="Link--inTextBlock" href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
</span>
<div data-view-component="true" class="flash-action"> <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn"> Show hidden characters
</a>
</div>
</div></template>
<template class="js-line-alert-template">
<span aria-label="This line has hidden Unicode characters" data-view-component="true" class="line-alert tooltipped tooltipped-e">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
</span></template>
<table data-hpc class="highlight tab-size js-file-line-container" data-tab-size="4" data-paste-markdown-skip data-tagsearch-path="malli_composite_test.clj">
<tr>
<td id="file-malli_composite_test-clj-L1" class="blob-num js-line-number js-blob-rnum" data-line-number="1"></td>
<td id="file-malli_composite_test-clj-LC1" class="blob-code blob-code-inner js-file-line">(require '[malli.composite :refer :all])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L2" class="blob-num js-line-number js-blob-rnum" data-line-number="2"></td>
<td id="file-malli_composite_test-clj-LC2" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L3" class="blob-num js-line-number js-blob-rnum" data-line-number="3"></td>
<td id="file-malli_composite_test-clj-LC3" class="blob-code blob-code-inner js-file-line">;; ## Data model</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L4" class="blob-num js-line-number js-blob-rnum" data-line-number="4"></td>
<td id="file-malli_composite_test-clj-LC4" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L5" class="blob-num js-line-number js-blob-rnum" data-line-number="5"></td>
<td id="file-malli_composite_test-clj-LC5" class="blob-code blob-code-inner js-file-line">;; -- Basic types</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L6" class="blob-num js-line-number js-blob-rnum" data-line-number="6"></td>
<td id="file-malli_composite_test-clj-LC6" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L7" class="blob-num js-line-number js-blob-rnum" data-line-number="7"></td>
<td id="file-malli_composite_test-clj-LC7" class="blob-code blob-code-inner js-file-line">(register! :user/first-name [:re {:min 5 :max 20} #"[a-z]+"])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L8" class="blob-num js-line-number js-blob-rnum" data-line-number="8"></td>
<td id="file-malli_composite_test-clj-LC8" class="blob-code blob-code-inner js-file-line">(register! :user/last-name [:re {:min 5 :max 20} #"[a-z]+"])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L9" class="blob-num js-line-number js-blob-rnum" data-line-number="9"></td>
<td id="file-malli_composite_test-clj-LC9" class="blob-code blob-code-inner js-file-line">(register! :user/webhost [:enum "gmail.com" "hotmail.com" "yahoo.com"])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L10" class="blob-num js-line-number js-blob-rnum" data-line-number="10"></td>
<td id="file-malli_composite_test-clj-LC10" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L11" class="blob-num js-line-number js-blob-rnum" data-line-number="11"></td>
<td id="file-malli_composite_test-clj-LC11" class="blob-code blob-code-inner js-file-line">;; -- Composite types</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L12" class="blob-num js-line-number js-blob-rnum" data-line-number="12"></td>
<td id="file-malli_composite_test-clj-LC12" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L13" class="blob-num js-line-number js-blob-rnum" data-line-number="13"></td>
<td id="file-malli_composite_test-clj-LC13" class="blob-code blob-code-inner js-file-line">(register! :user/username</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L14" class="blob-num js-line-number js-blob-rnum" data-line-number="14"></td>
<td id="file-malli_composite_test-clj-LC14" class="blob-code blob-code-inner js-file-line"> [:composite {:schema string?</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L15" class="blob-num js-line-number js-blob-rnum" data-line-number="15"></td>
<td id="file-malli_composite_test-clj-LC15" class="blob-code blob-code-inner js-file-line"> :compose (fn [first-name last-name]</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L16" class="blob-num js-line-number js-blob-rnum" data-line-number="16"></td>
<td id="file-malli_composite_test-clj-LC16" class="blob-code blob-code-inner js-file-line"> (str first-name "." last-name))</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L17" class="blob-num js-line-number js-blob-rnum" data-line-number="17"></td>
<td id="file-malli_composite_test-clj-LC17" class="blob-code blob-code-inner js-file-line"> :fields [:user/first-name :user/last-name]}])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L18" class="blob-num js-line-number js-blob-rnum" data-line-number="18"></td>
<td id="file-malli_composite_test-clj-LC18" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L19" class="blob-num js-line-number js-blob-rnum" data-line-number="19"></td>
<td id="file-malli_composite_test-clj-LC19" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L20" class="blob-num js-line-number js-blob-rnum" data-line-number="20"></td>
<td id="file-malli_composite_test-clj-LC20" class="blob-code blob-code-inner js-file-line">(register! :user/full-name</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L21" class="blob-num js-line-number js-blob-rnum" data-line-number="21"></td>
<td id="file-malli_composite_test-clj-LC21" class="blob-code blob-code-inner js-file-line"> [:composite {:schema string?</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L22" class="blob-num js-line-number js-blob-rnum" data-line-number="22"></td>
<td id="file-malli_composite_test-clj-LC22" class="blob-code blob-code-inner js-file-line"> :compose (fn [first-name last-name]</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L23" class="blob-num js-line-number js-blob-rnum" data-line-number="23"></td>
<td id="file-malli_composite_test-clj-LC23" class="blob-code blob-code-inner js-file-line"> (str first-name " " last-name))</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L24" class="blob-num js-line-number js-blob-rnum" data-line-number="24"></td>
<td id="file-malli_composite_test-clj-LC24" class="blob-code blob-code-inner js-file-line"> :fields [:user/first-name :user/last-name]}])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L25" class="blob-num js-line-number js-blob-rnum" data-line-number="25"></td>
<td id="file-malli_composite_test-clj-LC25" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L26" class="blob-num js-line-number js-blob-rnum" data-line-number="26"></td>
<td id="file-malli_composite_test-clj-LC26" class="blob-code blob-code-inner js-file-line">(register! :email/address</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L27" class="blob-num js-line-number js-blob-rnum" data-line-number="27"></td>
<td id="file-malli_composite_test-clj-LC27" class="blob-code blob-code-inner js-file-line"> [:composite {:schema string?</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L28" class="blob-num js-line-number js-blob-rnum" data-line-number="28"></td>
<td id="file-malli_composite_test-clj-LC28" class="blob-code blob-code-inner js-file-line"> :compose (fn [name domain]</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L29" class="blob-num js-line-number js-blob-rnum" data-line-number="29"></td>
<td id="file-malli_composite_test-clj-LC29" class="blob-code blob-code-inner js-file-line"> (str name "@" domain)</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L30" class="blob-num js-line-number js-blob-rnum" data-line-number="30"></td>
<td id="file-malli_composite_test-clj-LC30" class="blob-code blob-code-inner js-file-line"> )</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L31" class="blob-num js-line-number js-blob-rnum" data-line-number="31"></td>
<td id="file-malli_composite_test-clj-LC31" class="blob-code blob-code-inner js-file-line"> :fields [:user/username :user/webhost]}])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L32" class="blob-num js-line-number js-blob-rnum" data-line-number="32"></td>
<td id="file-malli_composite_test-clj-LC32" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L33" class="blob-num js-line-number js-blob-rnum" data-line-number="33"></td>
<td id="file-malli_composite_test-clj-LC33" class="blob-code blob-code-inner js-file-line">(register-entity! ::user</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L34" class="blob-num js-line-number js-blob-rnum" data-line-number="34"></td>
<td id="file-malli_composite_test-clj-LC34" class="blob-code blob-code-inner js-file-line"> [:user/first-name</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L35" class="blob-num js-line-number js-blob-rnum" data-line-number="35"></td>
<td id="file-malli_composite_test-clj-LC35" class="blob-code blob-code-inner js-file-line"> :user/last-name</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L36" class="blob-num js-line-number js-blob-rnum" data-line-number="36"></td>
<td id="file-malli_composite_test-clj-LC36" class="blob-code blob-code-inner js-file-line"> :user/full-name</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L37" class="blob-num js-line-number js-blob-rnum" data-line-number="37"></td>
<td id="file-malli_composite_test-clj-LC37" class="blob-code blob-code-inner js-file-line"> :user/username</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L38" class="blob-num js-line-number js-blob-rnum" data-line-number="38"></td>
<td id="file-malli_composite_test-clj-LC38" class="blob-code blob-code-inner js-file-line"> :email/address</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L39" class="blob-num js-line-number js-blob-rnum" data-line-number="39"></td>
<td id="file-malli_composite_test-clj-LC39" class="blob-code blob-code-inner js-file-line"> :user/webhost</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L40" class="blob-num js-line-number js-blob-rnum" data-line-number="40"></td>
<td id="file-malli_composite_test-clj-LC40" class="blob-code blob-code-inner js-file-line"> ])</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L41" class="blob-num js-line-number js-blob-rnum" data-line-number="41"></td>
<td id="file-malli_composite_test-clj-LC41" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L42" class="blob-num js-line-number js-blob-rnum" data-line-number="42"></td>
<td id="file-malli_composite_test-clj-LC42" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L43" class="blob-num js-line-number js-blob-rnum" data-line-number="43"></td>
<td id="file-malli_composite_test-clj-LC43" class="blob-code blob-code-inner js-file-line">(comment</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L44" class="blob-num js-line-number js-blob-rnum" data-line-number="44"></td>
<td id="file-malli_composite_test-clj-LC44" class="blob-code blob-code-inner js-file-line"> ;; All work individually:</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L45" class="blob-num js-line-number js-blob-rnum" data-line-number="45"></td>
<td id="file-malli_composite_test-clj-LC45" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L46" class="blob-num js-line-number js-blob-rnum" data-line-number="46"></td>
<td id="file-malli_composite_test-clj-LC46" class="blob-code blob-code-inner js-file-line"> (generate :user/username)</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L47" class="blob-num js-line-number js-blob-rnum" data-line-number="47"></td>
<td id="file-malli_composite_test-clj-LC47" class="blob-code blob-code-inner js-file-line"> (generate :user/webhost)</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L48" class="blob-num js-line-number js-blob-rnum" data-line-number="48"></td>
<td id="file-malli_composite_test-clj-LC48" class="blob-code blob-code-inner js-file-line"> (generate :email/address)</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L49" class="blob-num js-line-number js-blob-rnum" data-line-number="49"></td>
<td id="file-malli_composite_test-clj-LC49" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L50" class="blob-num js-line-number js-blob-rnum" data-line-number="50"></td>
<td id="file-malli_composite_test-clj-LC50" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L51" class="blob-num js-line-number js-blob-rnum" data-line-number="51"></td>
<td id="file-malli_composite_test-clj-LC51" class="blob-code blob-code-inner js-file-line"> ;; All work together:</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L52" class="blob-num js-line-number js-blob-rnum" data-line-number="52"></td>
<td id="file-malli_composite_test-clj-LC52" class="blob-code blob-code-inner js-file-line">
</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L53" class="blob-num js-line-number js-blob-rnum" data-line-number="53"></td>
<td id="file-malli_composite_test-clj-LC53" class="blob-code blob-code-inner js-file-line"> (generate ::user)</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L54" class="blob-num js-line-number js-blob-rnum" data-line-number="54"></td>
<td id="file-malli_composite_test-clj-LC54" class="blob-code blob-code-inner js-file-line"> ;;=></td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L55" class="blob-num js-line-number js-blob-rnum" data-line-number="55"></td>
<td id="file-malli_composite_test-clj-LC55" class="blob-code blob-code-inner js-file-line"> {:user/first-name "azdfbprmxxpkwlqnusxjlajc",</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L56" class="blob-num js-line-number js-blob-rnum" data-line-number="56"></td>
<td id="file-malli_composite_test-clj-LC56" class="blob-code blob-code-inner js-file-line"> :user/last-name "kptobaobrexnjwarfafsoavey",</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L57" class="blob-num js-line-number js-blob-rnum" data-line-number="57"></td>
<td id="file-malli_composite_test-clj-LC57" class="blob-code blob-code-inner js-file-line"> :user/full-name "azdfbprmxxpkwlqnusxjlajc kptobaobrexnjwarfafsoavey",</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L58" class="blob-num js-line-number js-blob-rnum" data-line-number="58"></td>
<td id="file-malli_composite_test-clj-LC58" class="blob-code blob-code-inner js-file-line"> :user/username "azdfbprmxxpkwlqnusxjlajc.kptobaobrexnjwarfafsoavey",</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L59" class="blob-num js-line-number js-blob-rnum" data-line-number="59"></td>
<td id="file-malli_composite_test-clj-LC59" class="blob-code blob-code-inner js-file-line"> :email/address</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L60" class="blob-num js-line-number js-blob-rnum" data-line-number="60"></td>
<td id="file-malli_composite_test-clj-LC60" class="blob-code blob-code-inner js-file-line"> "azdfbprmxxpkwlqnusxjlajc.kptobaobrexnjwarfafsoavey@gmail.com",</td>
</tr>
<tr>
<td id="file-malli_composite_test-clj-L61" class="blob-num js-line-number js-blob-rnum" data-line-number="61"></td>
<td id="file-malli_composite_test-clj-LC61" class="blob-code blob-code-inner js-file-line"> :user/webhost "gmail.com"})</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<a name="comments"></a>
<div class="js-quote-selection-container" data-quote-markdown=".js-comment-body">
<div class="js-discussion "
>
<div class="tmp-ml-md-6 tmp-pl-md-3 ml-0 pl-0">
<div class="TimelineItem d-block js-comment-container">
<div class="avatar-parent-child TimelineItem-avatar d-none d-md-block">
<a class="d-inline-block" data-hovercard-type="user" data-hovercard-url="/users/jeroenvandijk/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/jeroenvandijk"><img class=" avatar-user" src="https://avatars.githubusercontent.com/u/27645?s=80&v=4" width="40" height="40" alt="@jeroenvandijk" /></a>
</div>
<div id="gistcomment-4035562" class="timeline-comment-group js-minimizable-comment-group js-targetable-element my-0 comment previewable-edit js-task-list-container js-comment timeline-comment timeline-comment--caret tmp-ml-n3 js-minimize-container unminimized-comment">
<div class="timeline-comment-header clearfix d-flex flex-row flex-items-start" data-morpheus-enabled="false">
<h3 class="f5 text-normal py-2" style="flex: 1 1 auto">
<div class="d-flex flex-items-center flex-wrap gap-1">
<span class="d-inline-flex">
</span>
<strong>
<a class="author Link--primary text-bold css-overflow-wrap-anywhere " show_full_name="false" data-hovercard-type="user" data-hovercard-url="/users/jeroenvandijk/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/jeroenvandijk">jeroenvandijk</a>
</strong>
commented
<a href="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a?permalink_comment_id=4035562#gistcomment-4035562" id="gistcomment-4035562-permalink" class="Link--secondary js-timestamp"><relative-time datetime="2022-01-20T18:15:21Z" class="no-wrap">Jan 20, 2022</relative-time></a>
</div>
</h3>
<div class="d-flex flex-row-reverse flex-items-center flex-shrink-0 tmp-pl-3">
<div class="timeline-comment-actions flex-shrink-0 d-flex flex-items-center">
<details class="details-overlay details-reset position-relative d-inline-block">
<summary data-view-component="true" class="timeline-comment-action Link--secondary Button--link Button--medium Button"> <span class="Button-content">
<span class="Button-label"><svg aria-label="Show options" role="img" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal">
<path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path>
</svg></span>
</span>
</summary>
<details-menu
class="dropdown-menu dropdown-menu-sw show-more-popover color-fg-default"
style="width:185px"
src=""
preload
>
<span data-view-component="true">
<clipboard-copy aria-label="Copy link" for="gistcomment-4035562-permalink" role="menuitem" data-view-component="true" class="dropdown-item btn-link">
Copy link
</clipboard-copy> <div aria-live="polite" aria-atomic="true" class="sr-only" data-clipboard-copy-feedback></div>
</span> <span data-view-component="true">
<clipboard-copy role="menuitem" value="
Main idea is to easily create a data model through malli that will help you in generating consistent test and seed data." data-view-component="true" class="dropdown-item btn-link">
Copy Markdown
</clipboard-copy> <div aria-live="polite" aria-atomic="true" class="sr-only" data-clipboard-copy-feedback></div>
</span> </details-menu>
</details>
</div>
<div class="d-none d-sm-flex">
<span aria-label="This user is the author of this ." data-view-component="true" class="tooltipped tooltipped-n">
<span data-view-component="true" class="Label ml-1 tmp-ml-1">Author</span>
</span>
</div>
</div>
</div>
<div class="edit-comment-hide">
<task-lists disabled sortable>
<div class="comment-body markdown-body js-comment-body soft-wrap user-select-contain d-block">
<p dir="auto">Main idea is to easily create a data model through malli that will help you in generating consistent test and seed data.</p>
</div>
</task-lists>
</div>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="js-comment-update" data-type="json" data-turbo="false" action="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/comments/4035562" accept-charset="UTF-8" method="post"><input type="hidden" name="_method" value="put" autocomplete="off" /><input type="hidden" name="authenticity_token" value="5-paDzDdRDil72LeEqVz4Fru0yZ3CYP-c0k7gwrezIxMrUKGlWSu2PjEeyhflyPziIDU7mrU7IH2jlT-2HPixg" autocomplete="off" />
<include-fragment loading="lazy" src="/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a/comments/4035562/edit_form?textarea_id=gistcomment-4035562-body&comment_context=discussion" data-nonce="v2:b947ec73-6b20-89de-313a-0116c609293c" data-view-component="true" class="previewable-comment-form js-comment-edit-form-deferred-include-fragment">
<p class="text-center tmp-mt-3" data-hide-on-error>
<span data-view-component="true">
<svg aria-label="Loading..." style="box-sizing: content-box; color: var(--color-icon-primary);" width="32" height="32" viewBox="0 0 16 16" fill="none" role="img" data-view-component="true" class="anim-rotate">
<circle cx="8" cy="8" r="7" stroke="currentColor" stroke-opacity="0.25" stroke-width="2" vector-effect="non-scaling-stroke" fill="none"></circle>
<path d="M15 8a7.002 7.002 0 00-7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" vector-effect="non-scaling-stroke"></path>
</svg></span>
</p>
<p class="ml-1 mb-2 mt-2" data-show-on-error hidden>
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
Sorry, something went wrong.
</p>
<div data-show-on-forbidden-error hidden>
<div class="Box">
<div class="blankslate-container">
<div data-view-component="true" class="blankslate blankslate-spacious color-bg-default rounded-2">
<h3 data-view-component="true" class="blankslate-heading"> Uh oh!
</h3>
<p data-view-component="true" class="blankslate-description"> <p class="color-fg-muted my-2 mb-2 ws-normal">There was an error while loading. <a class="Link--inTextBlock" data-turbo="false" href="" aria-label="Please reload this page">Please reload this page</a>.</p>
</p>
</div> </div>
</div> </div>
</include-fragment>
</form>
</div>
</div>
<!-- Rendered timeline since 2022-01-20 10:16:44 -->
<div id="partial-timeline-marker"
class="js-timeline-marker js-updatable-content"
data-last-modified="Thu, 20 Jan 2022 18:16:44 GMT"
>
</div>
</div>
<div class="discussion-timeline-actions">
<div data-view-component="true" class="tmp-mt-3 flash flash-warn">
<a rel="nofollow" class="btn btn-primary" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"signed out comment","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="0b665388aff66bb16e99d28994d28f2dd429e38b03a51d3f6f87ddbe9d4e4442" href="/join?source=comment-gist">Sign up for free</a>
<strong>to join this conversation on GitHub</strong>.
Already have an account?
<a rel="nofollow" class="Link--inTextBlock" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"signed out comment","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://gist.github.com/jeroenvandijk/5e0785f25f7fdfeac7bc7a0be72cb62a","user_id":null}}" data-hydro-click-hmac="2d0c56c947a6055f846df0e257f464ac5d99fa320543757ce427baa5cc0c406c" data-test-selector="comments-sign-in-link" href="/login?return_to=https%3A%2F%2Fgist.github.com%2Fjeroenvandijk%2F5e0785f25f7fdfeac7bc7a0be72cb62a">Sign in to comment</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.container -->
</main>
</div>
</div>
<footer class="footer tmp-pt-7 tmp-pb-6 f6 color-fg-muted color-border-subtle p-responsive" role="contentinfo" >
<h2 class='sr-only'>Footer</h2>
<div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
<div class="d-flex flex-items-center flex-shrink-0 mx-2">
<a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
<svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
<path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
<span>
© 2026 GitHub, Inc.
</span>
</div>
<nav aria-label="Footer">
<h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>
<ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">
<li class="mx-2">
<a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
</li>
<li class="mx-2">
<a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
</li>
<li class="mx-2">
<a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
</li>
<li class="mx-2">
<a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
</li>
<li class="mx-2">
<a data-analytics-event="{"category":"Footer","action":"go to community","label":"text:community"}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
</li>
<li class="mx-2">
<a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
</li>
<li class="mx-2">
<a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
</li>
<li class="mx-2" >
<cookie-consent-link>
<button
type="button"
class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
data-action="click:cookie-consent-link#showConsentManagement"
data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}"
>
Manage cookies
</button>
</cookie-consent-link>
</li>
<li class="mx-2">
<cookie-consent-link>
<button
type="button"
class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
data-action="click:cookie-consent-link#showConsentManagement"
data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}"
>
Do not share my personal information
</button>
</cookie-consent-link>
</li>
</ul>
</nav>
</div>
</footer>
<ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
data-locale="en"
data-initial-cookie-consent-allowed=""
data-cookie-consent-required="false"
></ghcc-consent>
<div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
<button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button>
You can’t perform that action at this time.
</div>
<template id="site-details-dialog">
<details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
<summary role="button" aria-label="Close dialog"></summary>
<details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
<button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button>
<div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
</details-dialog>
</details>
</template>
<div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
<div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
</div>
</div>
<template id="snippet-clipboard-copy-button">
<div class="zeroclipboard-container position-absolute right-0 top-0">
<clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</clipboard-copy>
</div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
<div class="zeroclipboard-container">
<clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
<svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
</clipboard-copy>
</div>
</template>
</div>
<div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
<div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
</body>
</html>